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