def test_invalid_date_change(self): contest = Contest.objects.get(pk='c') delta = datetime.timedelta(days=55) new_dates = {} for item in date_registry.tolist(contest.id): obj = item['model'].objects.get(pk=item['id']) old_date = getattr(obj, item['date_field']) if old_date is not None: new_date = (old_date - delta).strftime("%Y-%m-%d %H:%M") new_dates[_get_date_id(item)] = new_date invalid_item = {'model': Round, 'id': 3, 'date_field': 'start_date'} invalid_date = '2019-10-10 10:10' invalid_item_id = _get_date_id(invalid_item) new_dates[invalid_item_id] = invalid_date response = self._send_post(contest, data=new_dates, admin_assertin='alert-danger') for item in date_registry.tolist(contest.id): obj = item['model'].objects.get(pk=item['id']) old_date = getattr(obj, item['date_field']) if old_date is not None: new_date = new_dates[_get_date_id(item)] self.assertContains(response, new_date) self.assertNotEqual(new_date, old_date.strftime("%Y-%m-%d %H:%M"))
def timeline_view(request): registry = date_registry.tolist(request.contest.id) group_registry = _make_group_registry(registry) for item in registry: item['date_id'] = _get_date_id(item) if request.POST: tosave = {} error_list = [] for item in registry: date = request.POST.get(item['date_id'], None) obj = item['model'].objects.get(pk=item['id']) if date: try: current_tz = timezone.get_current_timezone() parsed_date = current_tz.localize( datetime.datetime.strptime(date, "%Y-%m-%d %H:%M")) except ValueError: error_list.append((six.text_type(item['text']), {None: [_("Date format is invalid")]})) continue else: if not getattr(obj, item['date_field']): continue parsed_date = None item['date'] = parsed_date obj_str = six.text_type(item['model']) + str(item['id']) if obj_str in tosave: setattr(tosave[obj_str], item['date_field'], parsed_date) else: setattr(obj, item['date_field'], parsed_date) tosave[obj_str] = obj for obj in tosave.values(): try: obj.full_clean() except ValidationError as e: object_name = getattr(obj, 'name', None) if not object_name: object_name = '%s (%s)' % (obj._meta.verbose_name.title(), obj.id) message_dict = dict((_translate_field(field, obj), value) for (field, value) in e.message_dict.items()) error_list.append((object_name, message_dict)) if error_list: return TemplateResponse(request, 'timeline/timeline_view.html', {'registry': group_registry, 'error_list': sorted(error_list), 'server_timezone': settings.TIME_ZONE}) for obj in tosave.values(): obj.save() return TemplateResponse(request, 'timeline/timeline_view.html', {'registry': group_registry, 'server_timezone': settings.TIME_ZONE})
def timeline_view(request): registry = date_registry.tolist(request.contest.id) group_registry = _make_group_registry(registry) for item in registry: item['date_id'] = _get_date_id(item) if request.POST: tosave = {} error_list = [] for item in registry: date = request.POST.get(item['date_id'], None) obj = item['model'].objects.get(pk=item['id']) if date: try: current_tz = timezone.get_current_timezone() parsed_date = current_tz.localize( datetime.datetime.strptime(date, "%Y-%m-%d %H:%M")) except ValueError: error_list.append((unicode(item['text']), {None: [_("Date format is invalid")]})) continue else: if not getattr(obj, item['date_field']): continue parsed_date = None item['date'] = parsed_date obj_str = unicode(item['model']) + str(item['id']) if obj_str in tosave: setattr(tosave[obj_str], item['date_field'], parsed_date) else: setattr(obj, item['date_field'], parsed_date) tosave[obj_str] = obj for obj in tosave.values(): try: obj.full_clean() except ValidationError as e: object_name = getattr(obj, 'name', None) if not object_name: object_name = '%s (%s)' % (obj._meta.verbose_name.title(), obj.id) message_dict = dict((_translate_field(field, obj), value) for (field, value) in e.message_dict.items()) error_list.append((object_name, message_dict)) if error_list: return TemplateResponse(request, 'timeline/timeline_view.html', {'registry': group_registry, 'error_list': sorted(error_list), 'server_timezone': settings.TIME_ZONE}) for obj in tosave.values(): obj.save() return TemplateResponse(request, 'timeline/timeline_view.html', {'registry': group_registry, 'server_timezone': settings.TIME_ZONE})
def test_changing_date_in_wrong_contest(self): contest_c = Contest.objects.get(pk='c') contest_d = Contest.objects.get(pk='d') delta = datetime.timedelta(days=13) new_dates = {} for item in date_registry.tolist(contest_c.id): obj = item['model'].objects.get(pk=item['id']) old_date = getattr(obj, item['date_field']) if old_date is not None: new_date = (old_date + delta).strftime("%d/%m/%Y %H:%M") new_dates[_get_date_id(item)] = new_date self._send_post(contest_d, data=new_dates, contest_admin_code=403) for item in date_registry.tolist(contest_c.id): obj = item['model'].objects.get(pk=item['id']) old_date = getattr(obj, item['date_field']) if old_date is not None: old_date = old_date.strftime("%d/%m/%Y %H:%M") self.assertNotEqual(old_date, new_dates[_get_date_id(item)])
def timeline_view(request, contest_id): registry = date_registry.tolist(contest_id) for item in registry: item['date_id'] = _get_date_id(item) if request.POST: tosave = {} error_dict = {} for item in registry: date = request.POST.get(item['date_id'], None) obj = item['model'].objects.get(pk=item['id']) if date is None or getattr(obj, item['date_field']) is None: continue try: current_tz = timezone.get_current_timezone() parsed_date = current_tz.localize( datetime.datetime.strptime(date, "%Y-%m-%d %H:%M")) except ValueError: parsed_date = None error_dict[unicode(item['text'])] = \ {'date_format': [_("Date format is invalid")]} if parsed_date is not None: item['date'] = parsed_date obj_str = unicode(item['model']) + str(item['id']) if obj_str in tosave: setattr(tosave[obj_str]['obj'], item['date_field'], parsed_date) tosave[obj_str]['name'] += ", " + unicode(item['text']) else: setattr(obj, item['date_field'], parsed_date) tosave[obj_str] = {'obj': obj, 'name': item['text']} for item in tosave.values(): try: item['obj'].full_clean() except ValidationError as e: error_dict[item['name']] = e.message_dict if error_dict: return TemplateResponse(request, 'timeline/timeline_view.html', { 'registry': registry, 'error_dict': error_dict }) for item in tosave.values(): item['obj'].save() return TemplateResponse(request, 'timeline/timeline_view.html', {'registry': registry})
def test_valid_date_change(self): contest = Contest.objects.get(pk='c') delta = datetime.timedelta(days=21) new_dates = {} for item in date_registry.tolist(contest.id): obj = item['model'].objects.get(pk=item['id']) old_date = getattr(obj, item['date_field']) if old_date is not None: new_date = (old_date + delta).strftime("%Y-%m-%d %H:%M") new_dates[_get_date_id(item)] = new_date response = self._send_post(contest, data=new_dates, admin_assertnotin='alert-danger') for item in date_registry.tolist(contest.id): obj = item['model'].objects.get(pk=item['id']) date = getattr(obj, item['date_field']) if date is not None: date = date.strftime("%Y-%m-%d %H:%M") self.assertEqual(date, new_dates[_get_date_id(item)]) self.assertContains(response, date)
def test_valid_date_change(self): contest = Contest.objects.get(pk='c') delta = datetime.timedelta(days=21) new_dates = {} for item in date_registry.tolist(contest.id): obj = item['model'].objects.get(pk=item['id']) old_date = getattr(obj, item['date_field']) if old_date is not None: new_date = (old_date + delta).strftime("%Y-%m-%d %H:%M") new_dates[_get_date_id(item)] = new_date response = self._send_post(contest, data=new_dates, admin_assertnotin='error') for item in date_registry.tolist(contest.id): obj = item['model'].objects.get(pk=item['id']) date = getattr(obj, item['date_field']) if date is not None: date = date.strftime("%Y-%m-%d %H:%M") self.assertEqual(date, new_dates[_get_date_id(item)]) self.assertIn(date, response.content)
def test_invalid_date_format(self): contest = Contest.objects.get(pk='c') delta = datetime.timedelta(days=13) new_dates = {} for item in date_registry.tolist(contest.id): obj = item['model'].objects.get(pk=item['id']) old_date = getattr(obj, item['date_field']) if old_date is not None: new_date = (old_date + delta).strftime("%d/%m/%Y %H:%M") new_dates[_get_date_id(item)] = new_date self._send_post(contest, data=new_dates, admin_assertin='Date format is invalid')
def test_valid_unset_date_change(self): contest = Contest.objects.get(pk='c') unset_item = {'model': Round, 'id': 2, 'date_field': 'end_date'} new_date = '2021-10-10 10:10' unset_item_id = _get_date_id(unset_item) new_dates = {unset_item_id: new_date} for item in date_registry.tolist(contest.id): obj = item['model'].objects.get(pk=item['id']) old_date = getattr(obj, item['date_field']) if old_date is not None: new_date = old_date.strftime("%Y-%m-%d %H:%M") new_dates[_get_date_id(item)] = new_date self._send_post(data=new_dates) obj = Round.objects.get(pk=2) self.assertEqual(obj.end_date, datetime.datetime(2021, 10, 10, 10, 10, tzinfo=utc))
def test_response(self): contest = Contest.objects.get() url = reverse('timeline_view', kwargs={'contest_id': contest.id}) self.assertTrue(self.client.login(username='******')) check_not_accessible(self, url) self.assertTrue(self.client.login(username='******')) response = self.client.get(url, {'contest': contest}) self.assertEqual(response.status_code, 200) for item in date_registry.tolist(contest.id): obj = item['model'].objects.get(pk=item['id']) date = getattr(obj, item['date_field']) if date is not None: self.assertContains(response, date.strftime('%Y-%m-%d %H:%M')) for round in Round.objects.filter(contest=contest.id).values(): self.assertContains(response, round['start_date'].strftime('%Y-%m-%d %H:%M'))