Esempio n. 1
0
    def test_oionsite_user_info_page(self):
        contest = Contest.objects.get()
        contest.controller_name = \
                'oioioi.oi.controllers.OIOnsiteContestController'
        contest.save()
        user = User.objects.get(username='******')

        p = Participant(contest=contest, user=user)
        p.save()
        reg = OIOnsiteRegistration(participant=p, number=3, local_number=5)
        reg.save()

        self.client.login(username='******')
        url = reverse('user_info', kwargs={'contest_id': contest.id,
                                           'user_id': user.id})
        response = self.client.get(url)

        self.assertIn('<h4>OI info:</h4>', response.content)
    def handle(self, *args, **options):
        if len(args) != 2:
            raise CommandError(_("Expected two arguments"))

        try:
            contest = Contest.objects.get(id=args[0])
        except Contest.DoesNotExist:
            raise CommandError(_("Contest %s does not exist") % args[0])

        rcontroller = contest.controller.registration_controller()
        if not issubclass(getattr(rcontroller, 'participant_admin', None),
                          OIOnsiteRegistrationParticipantAdmin):
            raise CommandError(_("Wrong type of contest"))

        arg = args[1]

        if arg.startswith('http://') or arg.startswith('https://'):
            self.stdout.write(_("Fetching %s...\n") % (arg,))
            stream = urllib2.urlopen(arg)
        else:
            if not os.path.exists(arg):
                raise CommandError(_("File not found: ") + arg)
            stream = open(arg, 'r')

        reader = csv.reader(stream)
        header = reader.next()
        if header != self.COLUMNS:
            raise CommandError(_("Missing header or invalid columns: "
                "%(header)s\nExpected: %(expected)s") % {
                    'header': ', '.join(header),
                    'expected': ', '.join(self.COLUMNS)})

        with transaction.commit_on_success():
            ok = True
            all_count = 0
            for row in reader:
                all_count += 1

                for i, column in enumerate(self.COLUMNS):
                    row[i] = row[i].decode('utf8')

                try:
                    user = User.objects.get(username=row[1])
                    region = Region.objects.get(short_name=row[2],
                                                contest=contest)

                    participant, created = Participant.objects \
                            .get_or_create(contest=contest, user=user)

                    reg = OIOnsiteRegistration(participant=participant,
                            number=row[0], local_number=row[3], region=region)

                    reg.full_clean()
                    reg.save()
                except User.DoesNotExist:
                    self.stdout.write(_("Error for user=%(user)s: user does"
                        " not exist\n") % {'user': row[1]})
                    ok = False
                except Region.DoesNotExist:
                    self.stdout.write(_(
                        "Error for user=%(user)s: region %(region)s does"
                        " not exist\n") % {'user': row[1], 'region': row[2]})
                    ok = False
                except DatabaseError, e:
                    self.stdout.write(_(
                        "DB Error for user=%(user)s: %(message)s\n")
                            % {'user': row[1], 'message': e.message})
                    ok = False
                except ValidationError, e:
                    for k, v in e.message_dict.iteritems():
                        for message in v:
                            if k == '__all__':
                                self.stdout.write(_(
                                    "Error for user=%(user)s: %s\n")
                                        % (row[1], message))
                            else:
                                self.stdout.write(
                                        _("Error for user=%(user)s, "
                                            "field %(field)s: %(message)s\n")
                                        % {'user': row[1], 'field': k,
                                            'message': message})
                    ok = False
    def handle(self, *args, **options):
        if len(args) != 2:
            raise CommandError(_("Expected two arguments"))

        try:
            contest = Contest.objects.get(id=args[0])
        except Contest.DoesNotExist:
            raise CommandError(_("Contest %s does not exist") % args[0])

        rcontroller = contest.controller.registration_controller()
        if not issubclass(getattr(rcontroller, 'participant_admin', None),
                          OIOnsiteRegistrationParticipantAdmin):
            raise CommandError(_("Wrong type of contest"))

        arg = args[1]

        if arg.startswith('http://') or arg.startswith('https://'):
            self.stdout.write(_("Fetching %s...\n") % (arg, ))
            stream = urllib2.urlopen(arg)
        else:
            if not os.path.exists(arg):
                raise CommandError(_("File not found: ") + arg)
            stream = open(arg, 'r')

        reader = csv.reader(stream)
        header = reader.next()
        if header != self.COLUMNS:
            raise CommandError(
                _("Missing header or invalid columns: "
                  "%(header)s\nExpected: %(expected)s") % {
                      'header': ', '.join(header),
                      'expected': ', '.join(self.COLUMNS)
                  })

        with transaction.commit_on_success():
            ok = True
            all_count = 0
            for row in reader:
                all_count += 1

                for i, _column in enumerate(self.COLUMNS):
                    row[i] = row[i].decode('utf8')

                try:
                    user = User.objects.get(username=row[1])
                    region = Region.objects.get(short_name=row[2],
                                                contest=contest)

                    participant, created = Participant.objects \
                            .get_or_create(contest=contest, user=user)

                    reg = OIOnsiteRegistration(participant=participant,
                                               number=row[0],
                                               local_number=row[3],
                                               region=region)

                    reg.full_clean()
                    reg.save()
                except User.DoesNotExist:
                    self.stdout.write(
                        _("Error for user=%(user)s: user does"
                          " not exist\n") % {'user': row[1]})
                    ok = False
                except Region.DoesNotExist:
                    self.stdout.write(
                        _("Error for user=%(user)s: region %(region)s does"
                          " not exist\n") % {
                              'user': row[1],
                              'region': row[2]
                          })
                    ok = False
                except DatabaseError, e:
                    self.stdout.write(
                        _("DB Error for user=%(user)s: %(message)s\n") % {
                            'user': row[1],
                            'message': e.message
                        })
                    ok = False
                except ValidationError, e:
                    for k, v in e.message_dict.iteritems():
                        for message in v:
                            if k == '__all__':
                                self.stdout.write(
                                    _("Error for user=%(user)s: %s\n") %
                                    (row[1], message))
                            else:
                                self.stdout.write(
                                    _("Error for user=%(user)s, "
                                      "field %(field)s: %(message)s\n") % {
                                          'user': row[1],
                                          'field': k,
                                          'message': message
                                      })
                    ok = False