示例#1
0
    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"))
示例#2
0
    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"))
示例#3
0
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})
示例#4
0
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})
示例#5
0
    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)])
示例#6
0
    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})
示例#8
0
    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)
示例#9
0
    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)
示例#10
0
    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')
示例#11
0
    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')
示例#12
0
    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))
示例#13
0
    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))
示例#14
0
    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'))
示例#15
0
    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'))