def handle(self, *args, **options):
        client = APIClient(settings.DESKPRO_URL, settings.DESKPRO_KEY)
        self.log("DESKPRO: {}".format(settings.DESKPRO_URL))
        ticket_qs = models.DeskProTicket.objects.filter(
            published__isnull=True).order_by("created")

        if not ticket_qs.count():
            self.log("No tickets in queue")
            return

        for ticket in ticket_qs[:10]:
            self.log("Posting to Deskpro: #{}".format(ticket.id))

            try:
                client.create_ticket(ticket)
                ticket.published = datetime.datetime.now().replace(
                    tzinfo=models.UTC())
                ticket.save()
            except APIError as exc:
                self.log(
                    "!!!! Could not create ticket #{} - error data has been attached to ticket body."
                    .format(ticket.id))
                ticket.published = datetime.datetime.now().replace(
                    tzinfo=models.UTC())
                ticket.subject = "[FAILED] {}".format(ticket.subject)
                ticket.body = "{}\nAPI Delivery Error: {}".format(
                    ticket.body, exc.data)
                ticket.save()
Exemple #2
0
    def handle(self, *args, **options):
        client = APIClient(settings.DESKPRO_URL, settings.DESKPRO_KEY)
        self.log(f"DESKPRO: {settings.DESKPRO_URL}")

        # Per issue #858 we want to ignore the IX-F tickets
        ticket_qs = (models.DeskProTicket.objects.filter(
            published__isnull=True).exclude(
                subject__icontains="[IX-F]").order_by("created"))

        if not ticket_qs.count():
            self.log("No tickets in queue")
            return

        for ticket in ticket_qs[:10]:
            self.log(f"Posting to Deskpro: #{ticket.id}")

            try:
                client.create_ticket(ticket)
                ticket.published = datetime.datetime.now().replace(
                    tzinfo=models.UTC())
                ticket.save()
            except APIError as exc:
                self.log(
                    "!!!! Could not create ticket #{} - error data has been attached to ticket body."
                    .format(ticket.id))
                ticket.published = datetime.datetime.now().replace(
                    tzinfo=models.UTC())
                ticket.subject = f"[FAILED] {ticket.subject}"
                ticket.body = f"{ticket.body}\nAPI Delivery Error: {exc.data}"
                ticket.save()
Exemple #3
0
def sync_obj(cls, row):
    """
    we need to override django peeringdb's sync_obj function
    because our models differ slightly, not pretty, but good enough
    for now.
    """

    if row.get("status") != "ok":
        return

    try:
        obj = cls.objects.get(pk=row["id"])

    except cls.DoesNotExist:
        obj = cls()

    for k, v in row.items():
        if k in ["latitude", "longitude"] and v:
            v = "{:3.6f}".format(float(v))
        elif k == "fac_id":
            k = "facility_id"
        elif k == "net_id":
            k = "network_id"
        elif k == "info_prefixes4":
            v = max(v, 50000)
        elif k == "info_prefixes6":
            v = max(v, 10000)
        try:
            setattr(obj, k, v)
        except AttributeError:
            pass

    # print(obj, obj.id)

    try:
        # we want to validate because it fixes some values
        # but at the same time we don't care about any validation
        # errors, since we can assume that the data from the
        # server is already valid, nor do we want to block import
        # because our validators differ from the servers.
        obj.full_clean()
    except ValidationError as e:
        pass

    for field in cls._meta.get_fields():
        ftyp = cls._meta.get_field(field.name)
        value = getattr(obj, field.name, None)
        if isinstance(value, datetime.datetime):
            setattr(obj, field.name, value.replace(tzinfo=pdb_models.UTC()))
        else:
            if hasattr(ftyp, "related_name") and ftyp.multiple:
                continue
            else:
                try:
                    setattr(obj, field.name, value)
                except AttributeError:
                    pass

    obj.save()
    return
Exemple #4
0
    def setUpTestData(cls):

        cls.instances = {}
        cls.instances_accented = {}
        cls.instances_sponsored = {}

        # create an instance of each searchable model, so we have something
        # to search for
        cls.org = models.Organization.objects.create(name="Parent org")
        for model in search.autocomplete_models:
            cls.instances[model.handleref.tag] = cls.create_instance(
                model, cls.org)
            cls.instances_accented[model.handleref.tag] = cls.create_instance(
                model, cls.org, asn=2, accented=True)

        # we also need to test that sponsor ship status comes through
        # accordingly
        cls.org_w_sponsorship = models.Organization.objects.create(
            name="Sponsor Parent org", status="ok")

        now = datetime.datetime.now().replace(tzinfo=models.UTC())

        cls.sponsorship = models.Sponsorship.objects.create(
            start_date=now - datetime.timedelta(days=1),
            end_date=now + datetime.timedelta(days=1),
            level=1,
        )
        models.SponsorshipOrganization.objects.create(
            org=cls.org_w_sponsorship, sponsorship=cls.sponsorship)

        for model in search.autocomplete_models:
            cls.instances_sponsored[model.handleref.tag] = cls.create_instance(
                model, cls.org_w_sponsorship, asn=3, prefix="Sponsor")

        call_command("rebuild_index", "--noinput")
Exemple #5
0
    def clean(self, obj):
        """
        We override the object validation here to handle
        common validation issues that exist in the official production
        db, where valdiators are set, but data has not yet been
        fixed retroactively.

        These instances are:

        - info_prefixes4 on networks (adjust data)
        - info_prefixes6 on networks (adjust data)
        - overlapping prefixes on ixlan prefixes (skip validation)
        - invalid prefix length on ixlan prefixes (skip validation)
        - ipaddr4 out of prefix address space on netixlans (skip validation)
        - ipaddr6 out of prefix address space on netixlans (skip validation)
        """

        obj.updated = (obj._meta.get_field("updated").to_python(
            obj.updated).replace(tzinfo=models.UTC()))
        obj.created = (obj._meta.get_field("created").to_python(
            obj.created).replace(tzinfo=models.UTC()))
Exemple #6
0
    def save(self, obj):

        # make sure all datetime values have their timezone set

        for field in obj._meta.get_fields():
            if field.get_internal_type() == "DateTimeField":
                value = getattr(obj, field.name)
                if not value:
                    continue
                if isinstance(value, str):
                    value = field.to_python(value)
                value = value.replace(tzinfo=models.UTC())
                setattr(obj, field.name, value)

        if obj.HandleRef.tag == "ix":
            obj.save(create_ixlan=False)
        else:
            obj.save()
Exemple #7
0
    def setUpTestData(cls):

        # in case other tests updated the search index through object
        # creation we need to flush it
        search.SEARCH_CACHE["search_index"] = {}

        cls.instances = {}
        cls.instances_accented = {}
        cls.instances_sponsored = {}

        # create an instance of each searchable model, so we have something
        # to search for
        cls.org = models.Organization.objects.create(name="Parent org")
        for model in search.searchable_models:
            cls.instances[model.handleref.tag] = cls.create_instance(model, cls.org)
            cls.instances_accented[model.handleref.tag] = cls.create_instance(
                model, cls.org, asn=2, accented=True
            )

        # we also need to test that sponsor ship status comes through
        # accordingly
        cls.org_w_sponsorship = models.Organization.objects.create(
            name="Sponsor Parent org", status="ok"
        )

        now = datetime.datetime.now().replace(tzinfo=models.UTC())

        cls.sponsorship = models.Sponsorship.objects.create(
            start_date=now - datetime.timedelta(days=1),
            end_date=now + datetime.timedelta(days=1),
            level=1,
        )
        models.SponsorshipOrganization.objects.create(
            org=cls.org_w_sponsorship, sponsorship=cls.sponsorship
        )

        for model in search.searchable_models:
            cls.instances_sponsored[model.handleref.tag] = cls.create_instance(
                model, cls.org_w_sponsorship, asn=3, prefix="Sponsor"
            )