def _attach_report_to_ticket(report, ticket, new_ticket): from worker import database report.ticket = ticket report.status = 'Attached' report.save() database.log_action_on_ticket( ticket=ticket, action='attach_report', report=report, new_ticket=new_ticket ) database.set_ticket_higher_priority(report.ticket)
def update(report_id, body, user): """ Update a report """ allowed, body = _precheck_user_fields_update_authorizations(user, body) if not allowed: return 403, {'status': 'Forbidden', 'code': 403, 'message': 'You are not allowed to edit any fields'} try: report = Report.objects.get(id=int(report_id)) except (ObjectDoesNotExist, ValueError): return 404, {'status': 'Not Found', 'code': 404} # Update status if body.get('status') != report.status: code, resp = _update_status(body, report, user) if code != 200: return code, resp # Update defendant if 'defendant' in body: # Means unset defendant for report if body['defendant'] is None and report.defendant: report.reportItemRelatedReport.all().delete() report.service = None report.save() body['ticket'] = None body['status'] = 'New' elif report.defendant and body.get('defendant') and body['defendant'].get('customerId') != report.defendant.customerId: code, resp = update_defendant(body, report) if code != 200: return code, resp try: body['defendant'] = body['defendant']['id'] except (AttributeError, KeyError, TypeError, ValueError): pass # Update other fields try: valid_fields = ['defendant', 'category', 'ticket'] body = {k: v for k, v in body.iteritems() if k in valid_fields} Report.objects.filter(id=report.id).update(**body) report = Report.objects.get(id=int(report_id)) if report.ticket: database.set_ticket_higher_priority(report.ticket) except (KeyError, FieldDoesNotExist, FieldError, IntegrityError, TypeError, ValueError) as ex: return 400, {'status': 'Bad Request', 'code': 400, 'message': str(ex.message)} return show(report_id)
def apply(self, report, ticket, is_trusted=False, no_phishtocheck=False): """ Apply specific workflow on given `abuse.models.Report` :param `abuse.models.Report` report: A Cerberus report instance :param `abuse.models.Ticket` ticket: A Cerberus ticket instance :param bool is_trusted: If the report is trusted :param bool no_phishtocheck: if the report does not need PhishToCheck :return: If the workflow is applied :rtype: bool """ from worker import common, database ticket = database.create_ticket( report.defendant, report.category, report.service, attach_new=False ) database.log_action_on_ticket( ticket=ticket, action='attach_report', report=report, new_ticket=True ) # Add proof content = regexp.ACNS_PROOF.search(report.body).group() for email in re.findall(regexp.EMAIL, content): # Remove potentially sensitive emails content = content.replace(email, '*****@*****.**') Proof.objects.create( content=content, ticket=ticket, ) # Send emails to provider/defendant (template, email, lang) templates = [ (settings.CODENAMES['ack_received'], report.provider.email, 'EN'), (settings.CODENAMES['first_alert'], report.defendant.details.email, report.defendant.details.lang), ] for codename, email, lang in templates: common.send_email( ticket, [email], codename, lang=lang, acknowledged_report_id=report.id, ) # Close ticket ImplementationFactory.instance.get_singleton_of('MailerServiceBase').close_thread(ticket) resolution = Resolution.objects.get(codename=settings.CODENAMES['forward_acns']) ticket.resolution = resolution ticket.previousStatus = ticket.status ticket.status = 'Closed' ticket.update = False ticket.save() database.log_action_on_ticket( ticket=ticket, action='change_status', previous_value=ticket.previousStatus, new_value=ticket.status, close_reason=resolution.codename ) report.ticket = Ticket.objects.get(id=ticket.id) report.status = 'Archived' report.save() database.set_ticket_higher_priority(report.ticket) return True
def apply(self, report, ticket, is_trusted=False, no_phishtocheck=False): """ Apply specific workflow on given `abuse.models.Report` :param `abuse.models.Report` report: A Cerberus report instance :param `abuse.models.Ticket` ticket: A Cerberus ticket instance :param bool is_trusted: If the report is trusted :param bool no_phishtocheck: if the report does not need PhishToCheck :return: If the workflow is applied :rtype: bool """ from worker import common, database new_ticket = False if not ticket: # Create ticket ticket = database.create_ticket( report.defendant, report.category, report.service, attach_new=True ) new_ticket = True utils.scheduler.enqueue_in( timedelta(seconds=settings.GENERAL_CONFIG['copyright']['wait']), 'ticket.timeout', ticket_id=ticket.id, timeout=3600, ) ticket_snooze = settings.GENERAL_CONFIG['copyright']['wait'] ticket.previousStatus = ticket.status ticket.status = 'WaitingAnswer' ticket.snoozeDuration = ticket_snooze ticket.snoozeStart = datetime.now() ticket.save() database.log_action_on_ticket( ticket=ticket, action='attach_report', report=report, new_ticket=new_ticket, ) # Send emails to provider/defendant (template, email, lang) ticket.proof.all().delete() # Add proof content = report.body for email in re.findall(regexp.EMAIL, content): # Remove potentially sensitive emails content = content.replace(email, '*****@*****.**') Proof.objects.create( content=content, ticket=ticket, ) # Send emails templates = [ (settings.CODENAMES['ack_received'], report.provider.email, 'EN'), (settings.CODENAMES['first_alert'], report.defendant.details.email, report.defendant.details.lang), ] for codename, email, lang in templates: common.send_email( ticket, [email], codename, lang=lang, acknowledged_report_id=report.id, ) report.ticket = Ticket.objects.get(id=ticket.id) report.status = 'Attached' report.save() database.set_ticket_higher_priority(report.ticket) return True