def add(request): if request.method =='POST': form = TicketForm(request.POST) #print repr(form.cleaned_data) print request.POST if form.is_valid(): d = form.cleaned_data t = Ticket() t.priority = d['priority'] t.category = d['category'] t.summary = d['summary'] t.filedtime = datetime.datetime.now() t.lasttouched = t.filedtime t.filedby = request.user.member t.origin = d['origin'] t.status = d['status'] t.save() t.punts = d['punts'] fs = d['autofiles'] fs = fs.split(',') for f in fs: try: f = int(f) af = File.objects.get(id=f) t.files.add(af) except: pass t.files.add(*d['files']) t.assignedto.add(*d['assignedto']) t.save() #print repr(form.cleaned_data) return HttpResponseRedirect(('/tickets/'+str(t.id)+'/')) return detail(request, t.id) else: form = TicketForm() return newticket(request,form)
def email2ticket(string): """ Parse un mail et crée ou modifie le ticket concerné """ errors = [] mail = email.message_from_string(string) cur = None match = pattern_from.search(mail.get('From', '')) mail_from = mail.get('Return-Path', mail.get('Reply-To', match.groups()[0] if match else None)) references = mail.get('References', '').split() if not references: references = mail.get('In-Reply-To', '').split() if references: ticket = Ticket.objects.get(message_id__in=references) else: ticket = Ticket() # Get first part for part in mail.walk(): if part.get_content_type() in ('text/html', 'text/plain'): cur = part break if cur is None: return send_error(mail_from, ['Impossible de parser le message']) content = cur.get_payload(decode=True) if cur.get_content_type() == 'text/html': enc = cur.get_charsets()[0] content = content.decode(enc, 'ignore') content = html2text(content) match = pattern_body.search(content) if not match: errors.append('Contenu vide ou non encadré par [contenu][/contenu]') content = None else: content = match.groups()[0] user = User.objects.get(pk=settings.EMAIL_USER_PK) if references and content: # New comment form = type("", (), {})() form.cleaned_data = {'comment': content, 'internal': False} form.instance = ticket request = type("", (), {})() request.user = user post_comment(form, request) print "Ticket commenté ", ticket.pk elif not references: # New ticket try: subject = mail.get('Subject', '') match = pattern_subject.search(subject) ticket.client = Client.objects.get(pk=match.groups()[0]) subject = subject[match.span()[1]:] ticket.title = " ".join([part[0].decode(part[1] or 'utf8') for part in email.header.decode_header(subject)]) except: errors.append('Impossible de parser le sujet, client invalide ou sujet mal formé') if errors: send_error(mail_from, errors) else: ticket.message_id = mail.get('Message-ID', None) ticket.opened_by = user ticket.state = State.objects.get(pk=settings.TICKET_STATE_NEW) ticket.category = Category.objects.get(pk=settings.EMAIL_TICKET_CATEGORY_DEFAULT) ticket.text = content ticket.save() print "Ticket crée : ", ticket.pk elif errors: send_error(mail_from, errors) # Get attachements for part in mail.walk(): filename = part.get_filename() content_type = part.get_content_type() if filename and content_type in settings.IMAP_ALLOWED_CONTENT_TYPES: ticket_file = TicketFile(ticket=ticket, filename=filename, content_type=content_type, data=part.get_payload(decode=True)) ticket_file.save()