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…
Reference in a new issue