resolve merge conf
This commit is contained in:
		
							parent
							
								
									7b35bcae72
								
							
						
					
					
						commit
						650ddd2bcc
					
				
					 1 changed files with 111 additions and 0 deletions
				
			
		|  | @ -40,3 +40,114 @@ class SlotEditForm(forms.Form): | |||
|             "initial": self.slot.content_override, | ||||
|         } | ||||
|         return forms.CharField(**kwargs) | ||||
| 
 | ||||
| 
 | ||||
| class ScheduleSectionForm(forms.Form): | ||||
|     ROOM_KEY = 'room' | ||||
|     DATE_KEY = 'date' | ||||
|     START_KEY = 'time_start' | ||||
|     END_KEY = 'time_end' | ||||
|     KIND = 'kind' | ||||
| 
 | ||||
|     filename = forms.FileField( | ||||
|         label='Select a CSV file to import:', | ||||
|         required=False | ||||
|     ) | ||||
| 
 | ||||
|     def __init__(self, *args, **kwargs): | ||||
|         self.schedule = kwargs.pop("schedule") | ||||
|         super(ScheduleSectionForm, self).__init__(*args, **kwargs) | ||||
| 
 | ||||
|     def clean_filename(self): | ||||
|         if 'submit' in self.data: | ||||
|             fname = self.cleaned_data.get('filename') | ||||
|             if not fname or not fname.name.endswith('.csv'): | ||||
|                 raise forms.ValidationError(u'Please upload a .csv file') | ||||
|             return fname | ||||
| 
 | ||||
|     def _get_start_end_times(self, data): | ||||
|         "Return start and end time objects" | ||||
|         times = [] | ||||
|         for x in [data[self.START_KEY], data[self.END_KEY]]: | ||||
|             try: | ||||
|                 time_obj = time.strptime(x, '%I:%M %p') | ||||
|             except: | ||||
|                 return messages.ERROR, u'Malformed time found: %s.' % x | ||||
|             time_obj = datetime(100, 1, 1, time_obj.tm_hour, time_obj.tm_min, 00) | ||||
|             times.append(time_obj.time()) | ||||
|         return times | ||||
| 
 | ||||
|     def _build_rooms(self, data): | ||||
|         "Get or Create Rooms based on schedule type and set of Tracks" | ||||
|         created_rooms = [] | ||||
|         rooms = sorted(set([x[self.ROOM_KEY] for x in data])) | ||||
|         for i, room in enumerate(rooms): | ||||
|             room, created = Room.objects.get_or_create( | ||||
|                 schedule=self.schedule, name=room, order=i | ||||
|             ) | ||||
|             if created: | ||||
|                 created_rooms.append(room) | ||||
|         return created_rooms | ||||
| 
 | ||||
|     def _build_days(self, data): | ||||
|         "Get or Create Days based on schedule type and set of Days" | ||||
|         created_days = [] | ||||
|         days = set([x[self.DATE_KEY] for x in data]) | ||||
|         for day in days: | ||||
|             try: | ||||
|                 date = datetime.strptime(day, "%m/%d/%Y") | ||||
|             except ValueError: | ||||
|                 [x.delete() for x in created_days] | ||||
|                 return messages.ERROR, u'Malformed data found: %s.' % day | ||||
|             day, created = Day.objects.get_or_create( | ||||
|                 schedule=self.schedule, date=date | ||||
|             ) | ||||
|             if created: | ||||
|                 created_days.append(day) | ||||
|         return created_days | ||||
| 
 | ||||
|     def build_schedule(self): | ||||
|         created_items = [] | ||||
|         reader = csv.DictReader(self.cleaned_data.get('filename')) | ||||
|         data = [dict((k.strip(), v.strip()) for k, v in x.items()) for x in reader] | ||||
|         # build rooms | ||||
|         created_items.extend(self._build_rooms(data)) | ||||
|         # build_days | ||||
|         created_items.extend(self._build_days(data)) | ||||
|         # build Slot  -> SlotRoom | ||||
|         for row in data: | ||||
|             room = Room.objects.get( | ||||
|                 schedule=self.schedule, name=row[self.ROOM_KEY] | ||||
|             ) | ||||
|             date = datetime.strptime(row[self.DATE_KEY], "%m/%d/%Y") | ||||
|             day = Day.objects.get(schedule=self.schedule, date=date) | ||||
|             start, end = self._get_start_end_times(row) | ||||
|             slot_kind, created = SlotKind.objects.get_or_create( | ||||
|                 label=row[self.KIND], schedule=self.schedule | ||||
|             ) | ||||
|             if created: | ||||
|                 created_items.append(slot_kind) | ||||
|             if row[self.KIND] == 'plenary': | ||||
|                 slot, created = Slot.objects.get_or_create( | ||||
|                     kind=slot_kind, day=day, start=start, end=end | ||||
|                 ) | ||||
|                 if created: | ||||
|                     created_items.append(slot) | ||||
|             else: | ||||
|                 slot = Slot.objects.create( | ||||
|                     kind=slot_kind, day=day, start=start, end=end | ||||
|                 ) | ||||
|                 created_items.append(slot) | ||||
|             try: | ||||
|                 with transaction.atomic(): | ||||
|                     SlotRoom.objects.create(slot=slot, room=room) | ||||
|             except IntegrityError: | ||||
|                 # delete all created objects and report error | ||||
|                 for x in created_items: | ||||
|                     x.delete() | ||||
|                 return messages.ERROR, u'An overlap occurred; the import was cancelled.' | ||||
|         return messages.SUCCESS, u'Your schedule has been imported.' | ||||
| 
 | ||||
|     def delete_schedule(self): | ||||
|         self.schedule.day_set.all().delete() | ||||
|         return messages.SUCCESS, u'Your schedule has been deleted.' | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 David Ray
						David Ray