[Refacotere]Code.

bzr revid: vme@tinyerp.com-20140403071711-5dclywkcojrqu7dj
This commit is contained in:
Vidhin Mehta (OpenERP)
2014-04-03 12:47:11 +05:30
parent 17021e8bfb
commit 3357b38143
2 changed files with 114 additions and 126 deletions
@@ -43,7 +43,7 @@ class website_event(http.Controller):
# TODO: not implemented
@http.route(['/event/<model("event.event"):event>/agenda/'], type='http', auth="public", website=True, multilang=True)
def event_agenda(self, event, tag=None, **post):
values = request.registry.get('event.track').get_tracks_schedulre_details(request.cr, openerp.SUPERUSER_ID, event, context=request.context)
values = request.registry.get('event.track').get_sorted_tracks(request.cr, openerp.SUPERUSER_ID, event, context=request.context)
return request.website.render("website_event_track.agenda", values)
@http.route([
+113 -125
View File
@@ -28,82 +28,6 @@ from pytz import timezone
from collections import OrderedDict
from openerp import tools
def get_schedule(new_start_date, new_end_date, new_schedule):
'''
Function get_schedule creates time slots according to given track.
new_start_date, new_end_date : Date for creating new slots.
new_schedule : Dictionary contain all value to compare
rtype: new_schedule(new Dictionary with new time slot added)
'''
def insert_time(time, new_schedule):
for index,ct in enumerate(time):
for index2,dt in enumerate(new_schedule):
st, et = dt
if st == ct or et == ct:break
if st < ct and et > ct:
new_schedule.pop(index2)
new_schedule.insert(index2, [ct, et])
new_schedule.insert(index2, [st, ct])
break
return new_schedule
if not new_schedule:
new_schedule.append([new_start_date, new_end_date])
return new_schedule
first_start_date = new_schedule[0][0]
last_end_date = new_schedule[-1][1]
#totally outter
if first_start_date >= new_start_date and new_end_date >= last_end_date:
if not new_start_date == first_start_date:
new_schedule.insert(0, [new_start_date, first_start_date])
if not last_end_date == new_end_date:
new_schedule.append([last_end_date, new_end_date])
return new_schedule
#lower outer
if first_start_date >= new_end_date:
new_schedule.insert(0, [new_start_date, new_end_date])
if not new_end_date == first_start_date:
new_schedule.insert(1, [new_end_date, first_start_date])
return new_schedule
# upper outer
if new_start_date >= last_end_date:
if not last_end_date == new_start_date:
new_schedule.append([last_end_date, new_start_date])
new_schedule.append([new_start_date, new_end_date])
return new_schedule
#When inner time
if first_start_date <= new_start_date and last_end_date >= new_end_date:
new_schedule = insert_time([new_start_date, new_end_date], new_schedule)
return new_schedule
#when start date is more and end date in range
if first_start_date > new_start_date and last_end_date >= new_end_date:
new_schedule.insert(0, [new_start_date, first_start_date])
new_schedule = insert_time([new_end_date], new_schedule)
return new_schedule
#when end date is more and start date in range
if new_end_date > last_end_date and new_start_date >= first_start_date:
new_schedule = insert_time([new_start_date], new_schedule)
new_schedule.append([last_end_date, new_end_date])
return new_schedule
def convert_time(time, duration, local_tz):
'''
Function convert_time update value according to given timezone.
time: Value in string
duration: integer
rtype: start time, end time and date in string.
'''
local_dt = (datetime.datetime.strptime(time, tools.DEFAULT_SERVER_DATETIME_FORMAT)).replace(tzinfo=pytz.utc).astimezone(local_tz)
local_tz.normalize(local_dt)
return local_dt, local_dt + datetime.timedelta(minutes = duration), local_dt.strftime('%m-%d-%y')
class event_track_tag(osv.osv):
_name = "event.track.tag"
_columns = {
@@ -214,31 +138,84 @@ class event_track(osv.osv):
_group_by_full = {
'stage_id': _read_group_stage_ids,
}
def get_tracks_schedulre_details(self, cr, uid, event, context=None):
'''
Method get_tracks_schedulre_details create object in well format to show tabular form.
event: Browse Object of evenet.event
rtype:
rooms: room list contain id and name of location.
sort_tracks: Well form object of track data.
row_skip_td: To skip td for rowspan
talks: talks on everyday
format_date: format title
'''
keys_for_table = {}
format_date = []
sort_tracks = {}
room_list = []
rooms = []
talks = {}
row_skip_td = {}
domain = [('event_id','=',event.id),('date','!=',False),('duration','!=',False),('duration','!=',0)]
fields = ['id', 'duration', 'location_id', 'name', 'date', 'color', 'speaker_ids', 'website_published']
location_object = self.pool.get('event.track.location')
res_partner = self.pool.get('res.partner')
local_tz = pytz.timezone(event.timezone_of_event or 'UTC')
event_tracks = self.search_read(cr, uid, domain, fields, context=context)
@staticmethod
def calculate_slots(new_start_date, new_end_date, new_schedule):
if not new_schedule:
new_schedule.append([new_start_date, new_end_date])
return new_schedule
first_start_date = new_schedule[0][0]
last_end_date = new_schedule[-1][1]
def insert_time(time, new_schedule):
for new_date in time:
for index2, date in enumerate(new_schedule):
start_date, end_date = date
if start_date == new_date or end_date == new_date:break
if start_date < new_date and end_date > new_date:
new_schedule.pop(index2)
new_schedule.insert(index2, [new_date, end_date])
new_schedule.insert(index2, [start_date, new_date])
break
return new_schedule
#totally outter
if first_start_date >= new_start_date and new_end_date >= last_end_date:
if not new_start_date == first_start_date: new_schedule.insert(0, [new_start_date, first_start_date])
if not last_end_date == new_end_date: new_schedule.append([last_end_date, new_end_date])
return new_schedule
#lower outer
if first_start_date >= new_end_date:
new_schedule.insert(0, [new_start_date, new_end_date])
if not new_end_date == first_start_date: new_schedule.insert(1, [new_end_date, first_start_date])
return new_schedule
# upper outer
if new_start_date >= last_end_date:
if not last_end_date == new_start_date: new_schedule.append([last_end_date, new_start_date])
new_schedule.append([new_start_date, new_end_date])
return new_schedule
#When inner time
if first_start_date <= new_start_date and last_end_date >= new_end_date:
return insert_time([new_start_date, new_end_date], new_schedule)
#when start date is more and end date in range
if first_start_date > new_start_date and last_end_date >= new_end_date:
new_schedule.insert(0, [new_start_date, first_start_date])
return insert_time([new_end_date], new_schedule)
#when end date is more and start date in range
if new_end_date > last_end_date and new_start_date >= first_start_date:
new_schedule = insert_time([new_start_date], new_schedule)
new_schedule.append([last_end_date, new_end_date])
return new_schedule
@staticmethod
def convert_time(time, duration, local_tz):
local_dt = (datetime.datetime.strptime(time, tools.DEFAULT_SERVER_DATETIME_FORMAT)).replace(tzinfo=pytz.utc).astimezone(local_tz)
local_tz.normalize(local_dt)
return local_dt, local_dt + datetime.timedelta(minutes = duration), local_dt.strftime('%m-%d-%y')
@staticmethod
def generate_slots(date_and_durations, timezone):
local_tz = pytz.timezone(timezone or 'UTC')
got_slots = {}
sort_track = {}
for record in date_and_durations:
start_time, end_time, key = event_track.convert_time(record[0], record[1], local_tz)
if not got_slots.has_key(key):got_slots[key] = []
got_slots[key] = event_track.calculate_slots(start_time, end_time, got_slots[key])
for day in got_slots:
sort_track[day] = OrderedDict()
for slot in got_slots[day]:
time = slot[0].strftime('%H:%M')+" - "+slot[1].strftime('%H:%M')
sort_track[day][time] = []
return got_slots, sort_track
def make_tracks(self,cr, uid, only_slots={}, sort_tracks={}, event_tracks=[], timezone='UTC', context=None):
def get_speaker_name(ids):
speaker_names = res_partner.name_get(cr, uid, ids, context=context)
string = "By "
@@ -246,26 +223,15 @@ class event_track(osv.osv):
string = string + name[1]
if(speaker_names[-1:][0][0] != name[0]):string = string + ", "
return string
def set_value(key, val):
sort_tracks[key][val]=[]
res_partner = self.pool.get('res.partner')
local_tz = pytz.timezone(timezone)
for track in event_tracks:
start_time, end_time, key = convert_time(track['date'], track['duration'], local_tz)
if not keys_for_table.has_key(key):
keys_for_table[key] = []
sort_tracks[key] = OrderedDict()
talks[key] = 0
talks[key] = talks[key] + 1
keys_for_table[key] = get_schedule(start_time, end_time, keys_for_table[key])
[set_value(key, value[0].strftime('%H:%M')+" - "+value[1].strftime('%H:%M')) for key in keys_for_table.keys() for value in keys_for_table[key]]
for track in event_tracks:
if(track['location_id']):room_list.append(track['location_id'][0])
start_time, end_time, key = convert_time(track['date'], track['duration'], local_tz)
start_time, end_time, key = event_track.convert_time(track['date'], track['duration'], local_tz)
secret_key = None
row_span = 0
for index, value in enumerate(keys_for_table[key]):
for index, value in enumerate(only_slots[key]):
if value[0] <= start_time and value[1] > start_time:
keys = sort_tracks[key].keys()
secret_key = keys[index]
@@ -276,19 +242,23 @@ class event_track(osv.osv):
track['row_span'] = index - row_span
track['speaker_ids'] = get_speaker_name(track['speaker_ids']) if len(track['speaker_ids'])else ""
sort_tracks[key][secret_key].append(track)
for room in list(set(room_list)):
if room:rooms.append([room, location_object.browse(cr, uid, room).name])
return sort_tracks
@staticmethod
def calculate_and_sort(sort_tracks):
row_skip_td = {}
talks = {}
for track_day in sort_tracks.keys():
#format date eg. 4 june,2014.
format_date.append((datetime.datetime.strptime(track_day, '%m-%d-%y')).strftime("%d %B, %Y"))
talks[track_day] = 0
row_skip_td[track_day] = {}
time_slots = sort_tracks[track_day].keys()
for time_slot in time_slots:
#sort location id
sort_tracks[track_day][time_slot] = sorted(sort_tracks[track_day][time_slot], key=lambda x: x['location_id'])
#calculate_talks
talks[track_day] = talks[track_day] + len(sort_tracks[track_day][time_slot])
#Getting td which will skip in future.
for track in sort_tracks[track_day][time_slot]:
if track['row_span']:
@@ -297,14 +267,32 @@ class event_track(osv.osv):
if not row_skip_td[track_day].has_key(location_key):
row_skip_td[track_day] [location_key] = []
row_skip_td[track_day][location_key] = row_skip_td[track_day] [location_key] + skip_time
return row_skip_td, sort_tracks, talks
def get_location(self, cr, uid, location_list):
location_object = self.pool.get('event.track.location')
locations = []
for location_id in location_list:
locations.append([location_id, location_object.browse(cr, uid, location_id).name])
return locations
def get_sorted_tracks(self, cr, uid, event, context=None):
#Fetch all tracks
domain = [('event_id','=',event.id),('date','!=',False),('duration','!=',False),('duration','!=',0)]
fields = ['id', 'duration', 'location_id', 'name', 'date', 'color', 'speaker_ids', 'website_published']
event_tracks = self.search_read(cr, uid, domain, fields, context=context)
only_slots, sort_tracks = event_track.generate_slots([(track['date'], track['duration']) for track in event_tracks], event.timezone_of_event)
sort_tracks = self.make_tracks(cr, uid, only_slots, sort_tracks, event_tracks, event.timezone_of_event, context=context)
row_skip_td, sort_tracks, talks = event_track.calculate_and_sort(sort_tracks)
return {
'event': event,
'room_list': rooms,
'room_list': self.get_location(cr, uid, set([track['location_id'][0] for track in event_tracks if track['location_id']])),
'days': sort_tracks,
'row_skip_td': row_skip_td,
'talks': talks,
'format_date': format_date,
'format_date': [(datetime.datetime.strptime(day, '%m-%d-%y')).strftime("%d %B, %Y") for day in sort_tracks.keys()],
}
#
# Events
#