Пример #1
0
    def parse_matches(self, submitter):
        self.messages = []

        if not self.is_valid():
            self.messages.append(
                Message(_('Entered data was invalid, no changes made.'),
                        type=Message.ERROR))
            for field, errors in self.errors.items():
                for error in errors:
                    self.messages.append(
                        Message(error=error, field=self.fields[field].label))
            return []

        if not self.is_adm:
            self.prematchgroup = PreMatchGroup(
                date=self.cleaned_data['date'],
                event=self.cleaned_data['eventtext'],
                source=self.cleaned_data['source'],
                contact=self.cleaned_data['contact'],
                notes=self.cleaned_data['notes'],
                game=self.cleaned_data['game'],
                offline=self.cleaned_data['offline'],
            )
            self.prematchgroup.save()

        error_lines, matches = [], []
        for line in self.cleaned_data['matches'].splitlines():
            if line.strip() == '':
                continue

            try:
                parse_results = parse_match(line.strip(), allow_archon=False)
                pla_query = parse_results['pla']
                plb_query = parse_results['plb']
                sca = parse_results['sca']
                scb = parse_results['scb']

                make_flag = 'MAKE' in parse_results['flags']
                dup_flag = 'DUP' in parse_results['flags']
            except pyparsing.ParseException as e:
                self.messages.append(
                    Message(_("Could not parse '%(line)s' (%(error)s).") % {
                        'line': line,
                        'error': str(e)
                    },
                            type=Message.ERROR))
                self.close_after = False
                error_lines.append(line)
                continue

            pla_race_override = find_race_override(pla_query)
            plb_race_override = find_race_override(plb_query)

            try:
                match = self.make_match(
                    pla_query,
                    plb_query,
                    pla_race_override,
                    plb_race_override,
                    sca,
                    scb,
                    make_flag,
                    dup_flag,
                )
                if match is None:
                    error_lines.append(line)
                    continue
            except Exception as e:
                self.messages.append(
                    Message(_("Error creating match '%(line)s' (%(error)s).") %
                            {
                                'line': line,
                                'error': str(e)
                            },
                            type=Message.ERROR))
                self.close_after = False
                error_lines.append(line)
                continue

            if self.is_adm:
                match.submitter = submitter
            matches.append(match)

        for m in matches:
            m.save()
        if len(matches) > 0:
            self.messages.append(
                Message(ungettext_lazy('Successfully added %i match.',
                                       'Successfully added %i matches.',
                                       len(matches)) % len(matches),
                        type=Message.SUCCESS))

        if self.close_after:
            self.cleaned_data['eventobj'].close()
            self.messages.append(
                Message(_("Closed '%s'.") %
                        self.cleaned_data['eventobj'].fullname,
                        type=Message.SUCCESS))
        elif self.requested_close_after:
            self.messages.append(
                Message(_("Did not close '%s'.") %
                        self.cleaned_data['eventobj'].fullname,
                        type=Message.INFO))

        self.data = self.data.copy()
        self.data['matches'] = '\n'.join(error_lines)

        return matches