diff --git a/docs/dev/commands.md b/docs/dev/commands.md index 9eed8b47..45afac54 100644 --- a/docs/dev/commands.md +++ b/docs/dev/commands.md @@ -1,4 +1,4 @@ -Generated on 2021-10-15 07:56:57.136306 +Generated on 2021-11-02 10:01:21.394759 ## _db_command.py @@ -24,6 +24,10 @@ Replace a value in a field across several entities. Verification queue cleanup. +## pdb_delete_childless_org.py + +Delete childless org objects + ## pdb_delete_pocs.py Hard delete old soft-deleted network contract instances. @@ -118,3 +122,4 @@ Command line whois. ## pdb_wipe.py Wipe all peering data. + diff --git a/docs/dev/modules.md b/docs/dev/modules.md index 5de036fd..feab1f3f 100644 --- a/docs/dev/modules.md +++ b/docs/dev/modules.md @@ -1,4 +1,4 @@ -Generated on 2021-10-15 07:56:57.136306 +Generated on 2021-11-02 10:01:21.394759 ## [admin.py](/docs/dev/modules/admin.py.md) @@ -280,3 +280,4 @@ View definitions: - Entity views (network, facility, internet exchange and organization) - Sponsorships - User Registration + diff --git a/docs/dev/modules/admin.py.md b/docs/dev/modules/admin.py.md index 9d0221c7..22effe28 100644 --- a/docs/dev/modules/admin.py.md +++ b/docs/dev/modules/admin.py.md @@ -1,4 +1,4 @@ -Generated from admin.py on 2021-10-15 07:56:57.376975 +Generated from admin.py on 2021-11-02 10:01:21.611533 # peeringdb_server.admin diff --git a/docs/dev/modules/admin_commandline_tools.py.md b/docs/dev/modules/admin_commandline_tools.py.md index 55de404d..f0fa7636 100644 --- a/docs/dev/modules/admin_commandline_tools.py.md +++ b/docs/dev/modules/admin_commandline_tools.py.md @@ -1,4 +1,4 @@ -Generated from admin_commandline_tools.py on 2021-10-15 07:56:57.376975 +Generated from admin_commandline_tools.py on 2021-11-02 10:01:21.611533 # peeringdb_server.admin_commandline_tools diff --git a/docs/dev/modules/api_cache.py.md b/docs/dev/modules/api_cache.py.md index bbc1144a..41977070 100644 --- a/docs/dev/modules/api_cache.py.md +++ b/docs/dev/modules/api_cache.py.md @@ -1,4 +1,4 @@ -Generated from api_cache.py on 2021-10-15 07:56:57.376975 +Generated from api_cache.py on 2021-11-02 10:01:21.611533 # peeringdb_server.api_cache diff --git a/docs/dev/modules/api_key_views.py.md b/docs/dev/modules/api_key_views.py.md index ee52a843..4f7b8224 100644 --- a/docs/dev/modules/api_key_views.py.md +++ b/docs/dev/modules/api_key_views.py.md @@ -1,4 +1,4 @@ -Generated from api_key_views.py on 2021-10-15 07:56:57.376975 +Generated from api_key_views.py on 2021-11-02 10:01:21.611533 # peeringdb_server.api_key_views @@ -35,4 +35,4 @@ Save key permissions for the specified org and key. Perms should be a dict of permissioning ids and permission levels. ---- +--- \ No newline at end of file diff --git a/docs/dev/modules/api_schema.py.md b/docs/dev/modules/api_schema.py.md index c3337c23..593da3fc 100644 --- a/docs/dev/modules/api_schema.py.md +++ b/docs/dev/modules/api_schema.py.md @@ -1,4 +1,4 @@ -Generated from api_schema.py on 2021-10-15 07:56:57.376975 +Generated from api_schema.py on 2021-11-02 10:01:21.611533 # peeringdb_server.api_schema @@ -24,12 +24,6 @@ the peeringdb API docs. ### Methods -#### _get_operation_id -`def _get_operation_id(self, path, method)` - -Override this so operation ids become "{op} {reftag}" - ---- #### augment_create_ix `def augment_create_ix(self, serializer, model, op_dict)` @@ -108,6 +102,12 @@ Returns: Override this so we can augment the operation dict for an openapi schema operation. +--- +#### get_operation_id +`def get_operation_id(self, path, method)` + +Override this so operation ids become "{op} {reftag}" + --- #### get_operation_type `def get_operation_type(self, *args)` diff --git a/docs/dev/modules/apps.py.md b/docs/dev/modules/apps.py.md index 8f8c989f..cba68e3b 100644 --- a/docs/dev/modules/apps.py.md +++ b/docs/dev/modules/apps.py.md @@ -1,4 +1,4 @@ -Generated from apps.py on 2021-10-15 07:56:57.376975 +Generated from apps.py on 2021-11-02 10:01:21.611533 # peeringdb_server.apps diff --git a/docs/dev/modules/autocomplete_views.py.md b/docs/dev/modules/autocomplete_views.py.md index fa985451..e43dddbd 100644 --- a/docs/dev/modules/autocomplete_views.py.md +++ b/docs/dev/modules/autocomplete_views.py.md @@ -1,4 +1,4 @@ -Generated from autocomplete_views.py on 2021-10-15 07:56:57.136306 +Generated from autocomplete_views.py on 2021-11-02 10:01:21.394759 # peeringdb_server.autocomplete_views @@ -288,3 +288,4 @@ ToolHistory(peeringdb_server.autocomplete_views.CommandLineToolHistoryAutocomple ``` Autocomplete for command line tools that were run via the admin ui. + diff --git a/docs/dev/modules/context.py.md b/docs/dev/modules/context.py.md index 9054d433..5fc6c807 100644 --- a/docs/dev/modules/context.py.md +++ b/docs/dev/modules/context.py.md @@ -1,4 +1,4 @@ -Generated from context.py on 2021-10-15 07:56:57.376975 +Generated from context.py on 2021-11-02 10:01:21.611533 # peeringdb_server.context @@ -15,4 +15,4 @@ Will yield the current request, if there is one. To se the current request for the context pass it to the request parameter. ---- +--- \ No newline at end of file diff --git a/docs/dev/modules/data_views.py.md b/docs/dev/modules/data_views.py.md index 6f36798b..470d385d 100644 --- a/docs/dev/modules/data_views.py.md +++ b/docs/dev/modules/data_views.py.md @@ -1,4 +1,4 @@ -Generated from data_views.py on 2021-10-15 07:56:57.376975 +Generated from data_views.py on 2021-11-02 10:01:21.611533 # peeringdb_server.data_views @@ -56,4 +56,4 @@ available to site administrators. Return all sponsorships. ---- +--- \ No newline at end of file diff --git a/docs/dev/modules/db_router.py.md b/docs/dev/modules/db_router.py.md index 8e446516..49dd3397 100644 --- a/docs/dev/modules/db_router.py.md +++ b/docs/dev/modules/db_router.py.md @@ -1,4 +1,4 @@ -Generated from db_router.py on 2021-10-15 07:56:57.136306 +Generated from db_router.py on 2021-11-02 10:01:21.394759 # peeringdb_server.db_router @@ -27,3 +27,4 @@ TestRouter(peeringdb_server.db_router.DatabaseRouter) A very basic database router that routes to a different read and write db. + diff --git a/docs/dev/modules/deskpro.py.md b/docs/dev/modules/deskpro.py.md index 19a7ff8e..db146d03 100644 --- a/docs/dev/modules/deskpro.py.md +++ b/docs/dev/modules/deskpro.py.md @@ -1,4 +1,4 @@ -Generated from deskpro.py on 2021-10-15 07:56:57.376975 +Generated from deskpro.py on 2021-11-02 10:01:21.611533 # peeringdb_server.deskpro diff --git a/docs/dev/modules/export_views.py.md b/docs/dev/modules/export_views.py.md index 053ec810..eef0ea01 100644 --- a/docs/dev/modules/export_views.py.md +++ b/docs/dev/modules/export_views.py.md @@ -1,4 +1,4 @@ -Generated from export_views.py on 2021-10-15 07:56:57.376975 +Generated from export_views.py on 2021-11-02 10:01:21.611533 # peeringdb_server.export_views diff --git a/docs/dev/modules/forms.py.md b/docs/dev/modules/forms.py.md index e2aa9529..678ddea8 100644 --- a/docs/dev/modules/forms.py.md +++ b/docs/dev/modules/forms.py.md @@ -1,4 +1,4 @@ -Generated from forms.py on 2021-10-15 07:56:57.376975 +Generated from forms.py on 2021-11-02 10:01:21.611533 # peeringdb_server.forms diff --git a/docs/dev/modules/gendocs.py.md b/docs/dev/modules/gendocs.py.md index 92bf739d..87c9412f 100644 --- a/docs/dev/modules/gendocs.py.md +++ b/docs/dev/modules/gendocs.py.md @@ -1,3 +1,3 @@ -Generated from gendocs.py on 2021-10-15 07:56:57.136306 +Generated from gendocs.py on 2021-11-02 10:01:21.394759 # peeringdb_server.gendocs diff --git a/docs/dev/modules/geo.py.md b/docs/dev/modules/geo.py.md index 414db643..d8265b3f 100644 --- a/docs/dev/modules/geo.py.md +++ b/docs/dev/modules/geo.py.md @@ -1,4 +1,4 @@ -Generated from geo.py on 2021-10-15 07:56:57.376975 +Generated from geo.py on 2021-11-02 10:01:21.611533 # peeringdb_server.geo diff --git a/docs/dev/modules/import_views.py.md b/docs/dev/modules/import_views.py.md index e5248a13..74d7e3b1 100644 --- a/docs/dev/modules/import_views.py.md +++ b/docs/dev/modules/import_views.py.md @@ -1,4 +1,4 @@ -Generated from import_views.py on 2021-10-15 07:56:57.376975 +Generated from import_views.py on 2021-11-02 10:01:21.611533 # peeringdb_server.import_views @@ -12,4 +12,4 @@ Define ix-f import preview, review and post-mortem views. A simple decorator to enable basic auth for a specific view. ---- +--- \ No newline at end of file diff --git a/docs/dev/modules/inet.py.md b/docs/dev/modules/inet.py.md index 12749f0d..55c6d94a 100644 --- a/docs/dev/modules/inet.py.md +++ b/docs/dev/modules/inet.py.md @@ -1,4 +1,4 @@ -Generated from inet.py on 2021-10-15 07:56:57.376975 +Generated from inet.py on 2021-11-02 10:01:21.611533 # peeringdb_server.inet diff --git a/docs/dev/modules/ixf.py.md b/docs/dev/modules/ixf.py.md index f2243dc5..fbcd73a0 100644 --- a/docs/dev/modules/ixf.py.md +++ b/docs/dev/modules/ixf.py.md @@ -1,4 +1,4 @@ -Generated from ixf.py on 2021-10-15 07:56:57.376975 +Generated from ixf.py on 2021-11-02 10:01:21.611533 # peeringdb_server.ixf diff --git a/docs/dev/modules/mail.py.md b/docs/dev/modules/mail.py.md index 5d3f95ed..27aae2c3 100644 --- a/docs/dev/modules/mail.py.md +++ b/docs/dev/modules/mail.py.md @@ -1,4 +1,4 @@ -Generated from mail.py on 2021-10-15 07:56:57.376975 +Generated from mail.py on 2021-11-02 10:01:21.611533 # peeringdb_server.mail @@ -39,4 +39,4 @@ Arguments: - entity_source : handleref object, entity that was merged - entity_target : handleref object, entity that was merged into ---- +--- \ No newline at end of file diff --git a/docs/dev/modules/maintenance.py.md b/docs/dev/modules/maintenance.py.md index 5f6aff5c..6c9221b2 100644 --- a/docs/dev/modules/maintenance.py.md +++ b/docs/dev/modules/maintenance.py.md @@ -1,4 +1,4 @@ -Generated from maintenance.py on 2021-10-15 07:56:57.376975 +Generated from maintenance.py on 2021-11-02 10:01:21.611533 # peeringdb_server.maintenance diff --git a/docs/dev/modules/middleware.py.md b/docs/dev/modules/middleware.py.md index 933fbb9c..ccd00ec2 100644 --- a/docs/dev/modules/middleware.py.md +++ b/docs/dev/modules/middleware.py.md @@ -1,4 +1,4 @@ -Generated from middleware.py on 2021-10-15 07:56:57.376975 +Generated from middleware.py on 2021-11-02 10:01:21.611533 # peeringdb_server.middleware diff --git a/docs/dev/modules/mock.py.md b/docs/dev/modules/mock.py.md index 3f278fac..044b9d4d 100644 --- a/docs/dev/modules/mock.py.md +++ b/docs/dev/modules/mock.py.md @@ -1,4 +1,4 @@ -Generated from mock.py on 2021-10-15 07:56:57.376975 +Generated from mock.py on 2021-11-02 10:01:21.611533 # peeringdb_server.mock diff --git a/docs/dev/modules/models.py.md b/docs/dev/modules/models.py.md index e10f8378..f7f7867d 100644 --- a/docs/dev/modules/models.py.md +++ b/docs/dev/modules/models.py.md @@ -1,4 +1,4 @@ -Generated from models.py on 2021-10-15 07:56:57.376975 +Generated from models.py on 2021-11-02 10:01:21.611533 # peeringdb_server.models @@ -1416,6 +1416,10 @@ of the following is True: to execute administrative actions (user management, user permission management). - group_name (`@property`): Returns usergroup name for this organization. +- is_empty (`@property`): Returns whether or not the organization is empty + +An empty organization means an organization that does not +have any objects with status ok or pending under it - ix_set_active (`@property`): Returns queryset holding active exchanges in this organization. - net_set_active (`@property`): Returns queryset holding active networks in this organization. - owned (`@property`): Returns whether or not the organization has been claimed diff --git a/docs/dev/modules/org_admin_views.py.md b/docs/dev/modules/org_admin_views.py.md index 0a275148..309945dc 100644 --- a/docs/dev/modules/org_admin_views.py.md +++ b/docs/dev/modules/org_admin_views.py.md @@ -1,4 +1,4 @@ -Generated from org_admin_views.py on 2021-10-15 07:56:57.376975 +Generated from org_admin_views.py on 2021-11-02 10:01:21.611533 # peeringdb_server.org_admin_views @@ -72,4 +72,4 @@ Should be below org_admin_required. Also sets "user" in kwargs. ---- +--- \ No newline at end of file diff --git a/docs/dev/modules/permissions.py.md b/docs/dev/modules/permissions.py.md index a6c661a3..57222e41 100644 --- a/docs/dev/modules/permissions.py.md +++ b/docs/dev/modules/permissions.py.md @@ -1,4 +1,4 @@ -Generated from permissions.py on 2021-10-15 07:56:57.376975 +Generated from permissions.py on 2021-11-02 10:01:21.611533 # peeringdb_server.permissions diff --git a/docs/dev/modules/renderers.py.md b/docs/dev/modules/renderers.py.md index 7e46fae9..1be82ffa 100644 --- a/docs/dev/modules/renderers.py.md +++ b/docs/dev/modules/renderers.py.md @@ -1,4 +1,4 @@ -Generated from renderers.py on 2021-10-15 07:56:57.376975 +Generated from renderers.py on 2021-11-02 10:01:21.611533 # peeringdb_server.renderers @@ -58,3 +58,4 @@ MungeRenderer(rest_framework.renderers.BaseRenderer) All renderers should extend this class, setting the `media_type` and `format` attributes, and override the `.render()` method. + diff --git a/docs/dev/modules/request.py.md b/docs/dev/modules/request.py.md index 94f5fbf6..3c1c4a5c 100644 --- a/docs/dev/modules/request.py.md +++ b/docs/dev/modules/request.py.md @@ -1,4 +1,4 @@ -Generated from request.py on 2021-10-15 07:56:57.376975 +Generated from request.py on 2021-11-02 10:01:21.611533 # peeringdb_server.request @@ -19,4 +19,4 @@ context. If no request can be obtained this will return False. ---- +--- \ No newline at end of file diff --git a/docs/dev/modules/rest.py.md b/docs/dev/modules/rest.py.md index 4ea0d9a2..2583ea9e 100644 --- a/docs/dev/modules/rest.py.md +++ b/docs/dev/modules/rest.py.md @@ -1,4 +1,4 @@ -Generated from rest.py on 2021-10-15 07:56:57.376975 +Generated from rest.py on 2021-11-02 10:01:21.611533 # peeringdb_server.rest diff --git a/docs/dev/modules/rest_throttles.py.md b/docs/dev/modules/rest_throttles.py.md index a801317c..a775ce92 100644 --- a/docs/dev/modules/rest_throttles.py.md +++ b/docs/dev/modules/rest_throttles.py.md @@ -1,4 +1,4 @@ -Generated from rest_throttles.py on 2021-10-15 07:56:57.376975 +Generated from rest_throttles.py on 2021-11-02 10:01:21.611533 # peeringdb_server.rest_throttles diff --git a/docs/dev/modules/search.py.md b/docs/dev/modules/search.py.md index 83a9e68e..57999819 100644 --- a/docs/dev/modules/search.py.md +++ b/docs/dev/modules/search.py.md @@ -1,4 +1,4 @@ -Generated from search.py on 2021-10-15 07:56:57.376975 +Generated from search.py on 2021-11-02 10:01:21.611533 # peeringdb_server.search @@ -20,4 +20,4 @@ Search searchable objects (ixp, network, facility ...) by term. Returns result dict. ---- +--- \ No newline at end of file diff --git a/docs/dev/modules/search_indexes.py.md b/docs/dev/modules/search_indexes.py.md index cfe1bd43..f8fcf182 100644 --- a/docs/dev/modules/search_indexes.py.md +++ b/docs/dev/modules/search_indexes.py.md @@ -1,4 +1,4 @@ -Generated from search_indexes.py on 2021-10-15 07:56:57.376975 +Generated from search_indexes.py on 2021-11-02 10:01:21.611533 # peeringdb_server.search_indexes diff --git a/docs/dev/modules/serializers.py.md b/docs/dev/modules/serializers.py.md index bd18a7cb..c44b5834 100644 --- a/docs/dev/modules/serializers.py.md +++ b/docs/dev/modules/serializers.py.md @@ -1,4 +1,4 @@ -Generated from serializers.py on 2021-10-15 07:56:57.376975 +Generated from serializers.py on 2021-11-02 10:01:21.611533 # peeringdb_server.serializers @@ -35,6 +35,22 @@ FIXME: should be renamed on model schema. # Classes --- +## ASSetSerializer + +``` +ASSetSerializer(peeringdb_server.serializers.NetworkSerializer) +``` + +Serializer for peeringdb_server.models.Network + +Possible realtionship queries: + - org_id, handled by serializer + - ix_id, handled by prepare_query + - ixlan_id, handled by prepare_query + - netfac_id, handled by prepare_query + - fac_id, handled by prepare_query + + ## AddressSerializer ``` @@ -352,7 +368,7 @@ Return max depth according to whether resultset is list or single GET. --- #### prefetch_related -`def prefetch_related(cls, qset, request, prefetch=None, related=None, nested=, depth=None, is_list=False, single=None)` +`def prefetch_related(cls, qset, request, prefetch=None, related=None, nested=, depth=None, is_list=False, single=None, selective=None)` Prefetch related sets according to depth specified in the request. @@ -375,6 +391,16 @@ Returns a list of all second level queryable relation fields. Initialize self. See help(type(self)) for accurate signature. +--- +#### _handle_netixlan_reclaim +`def _handle_netixlan_reclaim(self, ipaddr4, ipaddr6)` + +Handles logic of reclaiming ipaddresses from soft-deleted +netixlans in case where ipv4 and ipv6 are on separate netixlan objects + +Will raise a django DoesNotExist error if either ipaddress does not +exist on a deleted netixlan + --- #### create `def create(self, validated_data)` diff --git a/docs/dev/modules/settings.py.md b/docs/dev/modules/settings.py.md index 383c30b5..0a69ca23 100644 --- a/docs/dev/modules/settings.py.md +++ b/docs/dev/modules/settings.py.md @@ -1,4 +1,4 @@ -Generated from settings.py on 2021-10-15 07:56:57.376975 +Generated from settings.py on 2021-11-02 10:01:21.611533 # peeringdb_server.settings diff --git a/docs/dev/modules/signals.py.md b/docs/dev/modules/signals.py.md index 834229ee..ab93abb0 100644 --- a/docs/dev/modules/signals.py.md +++ b/docs/dev/modules/signals.py.md @@ -1,4 +1,4 @@ -Generated from signals.py on 2021-10-15 07:56:57.376975 +Generated from signals.py on 2021-11-02 10:01:21.611533 # peeringdb_server.signals @@ -82,4 +82,4 @@ and update net_count for the related InternetExchange. Updates 'attribute' field in Network whenever it's called. ---- +--- \ No newline at end of file diff --git a/docs/dev/modules/stats.py.md b/docs/dev/modules/stats.py.md index 4e9c0743..f41b1c0a 100644 --- a/docs/dev/modules/stats.py.md +++ b/docs/dev/modules/stats.py.md @@ -1,4 +1,4 @@ -Generated from stats.py on 2021-10-15 07:56:57.376975 +Generated from stats.py on 2021-11-02 10:01:21.611533 # peeringdb_server.stats diff --git a/docs/dev/modules/urls.py.md b/docs/dev/modules/urls.py.md index 4d106672..806e6af5 100644 --- a/docs/dev/modules/urls.py.md +++ b/docs/dev/modules/urls.py.md @@ -1,4 +1,4 @@ -Generated from urls.py on 2021-10-15 07:56:57.376975 +Generated from urls.py on 2021-11-02 10:01:21.611533 # peeringdb_server.urls diff --git a/docs/dev/modules/util.py.md b/docs/dev/modules/util.py.md index 3b0ed014..a875b30d 100644 --- a/docs/dev/modules/util.py.md +++ b/docs/dev/modules/util.py.md @@ -1,4 +1,4 @@ -Generated from util.py on 2021-10-15 07:56:57.376975 +Generated from util.py on 2021-11-02 10:01:21.611533 # peeringdb_server.util diff --git a/docs/dev/modules/validators.py.md b/docs/dev/modules/validators.py.md index 1e2012f0..5aae4977 100644 --- a/docs/dev/modules/validators.py.md +++ b/docs/dev/modules/validators.py.md @@ -1,4 +1,4 @@ -Generated from validators.py on 2021-10-15 07:56:57.376975 +Generated from validators.py on 2021-11-02 10:01:21.611533 # peeringdb_server.validators @@ -97,4 +97,4 @@ Raises: Returns: - str: zipcode ---- +--- \ No newline at end of file diff --git a/docs/dev/modules/views.py.md b/docs/dev/modules/views.py.md index 397c1ffc..8d8dc049 100644 --- a/docs/dev/modules/views.py.md +++ b/docs/dev/modules/views.py.md @@ -1,4 +1,4 @@ -Generated from views.py on 2021-10-15 07:56:57.376975 +Generated from views.py on 2021-11-02 10:01:21.611533 # peeringdb_server.views diff --git a/docs/img/schema.png b/docs/img/schema.png index a01525b5..d14140d5 100644 Binary files a/docs/img/schema.png and b/docs/img/schema.png differ diff --git a/mainsite/settings/__init__.py b/mainsite/settings/__init__.py index 0207d75f..814e59d7 100644 --- a/mainsite/settings/__init__.py +++ b/mainsite/settings/__init__.py @@ -880,8 +880,19 @@ set_option("MAIL_DEBUG", DEBUG) # Setting for automated resending of failed ixf import emails set_option("IXF_RESEND_FAILED_EMAILS", False) +# Set value for IX-F fetch timeout +set_option("IXF_FETCH_TIMEOUT", 30) + +# Setting for number of days before deleting childless Organizations +set_option("ORG_CHILDLESS_DELETE_DURATION", 30) + +# Grace period before an organization is processed for childless cleanup +# n days after creation +set_option("ORG_CHILDLESS_GRACE_DURATION", 1) + TEMPLATES[0]["OPTIONS"]["debug"] = DEBUG + if DEBUG: # make all loggers use the console. for logger in LOGGING["loggers"]: diff --git a/peeringdb_server/admin.py b/peeringdb_server/admin.py index 946527a9..f610a92a 100644 --- a/peeringdb_server/admin.py +++ b/peeringdb_server/admin.py @@ -1019,7 +1019,7 @@ class OrganizationAdmin(ModelAdminWithVQCtrl, SoftDeleteAdmin): list_display = ("handle", "name", "status", "created", "updated") ordering = ("-created",) search_fields = ("name",) - list_filter = (StatusFilter,) + list_filter = (StatusFilter, "flagged") readonly_fields = ("id", "grainy_namespace") form = OrganizationAdminForm @@ -1046,6 +1046,8 @@ class OrganizationAdmin(ModelAdminWithVQCtrl, SoftDeleteAdmin): "verification_queue", "version", "id", + "flagged", + "flagged_date", "grainy_namespace", ] diff --git a/peeringdb_server/api_schema.py b/peeringdb_server/api_schema.py index 6f40865c..621ac7c8 100644 --- a/peeringdb_server/api_schema.py +++ b/peeringdb_server/api_schema.py @@ -86,7 +86,7 @@ class BaseSchema(AutoSchema): return method.lower() - def _get_operation_id(self, path, method): + def get_operation_id(self, path, method): """ Override this so operation ids become "{op} {reftag}" """ @@ -95,9 +95,19 @@ class BaseSchema(AutoSchema): op_type = self.get_operation_type(path, method) if model: + + # Overrides for duplicate operations ids + + if "request_ixf_import" in path: + return f"{op_type} IX-F import request" + elif "as_set/{asn}" in path: + return f"{op_type} as-set by asn" + elif "as_set" in path: + return f"{op_type} as-set" + return f"{op_type} {model.HandleRef.tag}" - return super()._get_operation_id(path, method) + return super().get_operation_id(path, method) def get_operation(self, *args, **kwargs): @@ -122,6 +132,17 @@ class BaseSchema(AutoSchema): serializer, model = self.get_classes(*args) + # Override the the requestBody with components instead of using reference + components = super().get_components(*args).get(model.__name__) + + content_types = [ + "application/json", + ] + # Override schema for create, update and patch operations + if components and op_type in ["create", "update", "patch"]: + for content_type in content_types: + op_dict["requestBody"]["content"][content_type]["schema"] = components + # if we were able to get a model we want to include the markdown documentation # for the model type in the openapi description field (docs/api/obj_*.md) @@ -135,7 +156,6 @@ class BaseSchema(AutoSchema): # check if we have an augmentation method set for the operation_type and object type # combination, if so run it - augment = getattr(self, f"augment_{op_type}_{model.HandleRef.tag}", None) if augment: augment(serializer, model, op_dict) @@ -540,9 +560,6 @@ class BaseSchema(AutoSchema): # prefix on `update` will be ignored del properties["prefix"] - # suggest on `update` will be ignored - del properties["suggest"] - def augment_update_fac(self, serializer, model, op_dict): """ Augment openapi schema for update fac operation. diff --git a/peeringdb_server/client_adaptor/backend.py b/peeringdb_server/client_adaptor/backend.py index a0a40037..fc889ef8 100644 --- a/peeringdb_server/client_adaptor/backend.py +++ b/peeringdb_server/client_adaptor/backend.py @@ -11,9 +11,9 @@ from django.db import IntegrityError from django.db.models import OneToOneRel from django_peeringdb.client_adaptor.backend import Backend as BaseBackend from django_peeringdb.client_adaptor.backend import reftag_to_cls +from peeringdb import resource import peeringdb_server.models as models -from peeringdb import resource __version__ = "1.0" diff --git a/peeringdb_server/gendocs.py b/peeringdb_server/gendocs.py index f33ae286..88c63951 100644 --- a/peeringdb_server/gendocs.py +++ b/peeringdb_server/gendocs.py @@ -1,13 +1,11 @@ import datetime -import importlib import os import django +from pymdgen import doc_module django.setup() -from pymdgen import doc_module - module_index = {} command_index = {} diff --git a/peeringdb_server/management/commands/pdb_api_test.py b/peeringdb_server/management/commands/pdb_api_test.py index b71317b1..0041845f 100644 --- a/peeringdb_server/management/commands/pdb_api_test.py +++ b/peeringdb_server/management/commands/pdb_api_test.py @@ -264,6 +264,8 @@ class TestJSON(unittest.TestCase): "tech_phone": PHONE, "policy_email": EMAIL, "policy_phone": PHONE, + "sales_email": EMAIL, + "sales_phone": PHONE, } data.update(**kwargs) return data @@ -2016,6 +2018,94 @@ class TestJSON(unittest.TestCase): ########################################################################## + def test_org_admin_002_POST_netixlan_reclaim(self): + + # create 1 deleted netixlan + + data_a = self.make_data_netixlan( + network_id=SHARED["net_rw_ok"].id, + ixlan_id=SHARED["ixlan_rw_ok"].id, + asn=SHARED["net_rw_ok"].asn, + status="deleted", + ) + data_a.pop("net_id") + netixlan_a = NetworkIXLan.objects.create(**data_a) + + # create new netixlan re-claiming ipv4 and ipv6 + # addresses from the 2 netixlans we created earlier + # ipv4 from netixlan a + # ipv6 from netixlan b + + data_c = self.make_data_netixlan( + net_id=SHARED["net_rw_ok"].id, + ixlan_id=SHARED["ixlan_rw_ok"].id, + asn=SHARED["net_rw_ok"].asn, + ) + data_c.update(ipaddr4=f"{netixlan_a.ipaddr4}", ipaddr6=f"{netixlan_a.ipaddr6}") + + r_data = self.assert_create( + self.db_org_admin, + "netixlan", + data_c, + ) + + assert r_data["ipaddr4"] == f"{netixlan_a.ipaddr4}" + assert r_data["ipaddr6"] == f"{netixlan_a.ipaddr6}" + assert r_data["id"] == netixlan_a.id + + ########################################################################## + + def test_org_admin_002_POST_netixlan_reclaim_separated(self): + + # create 2 deleted netixlans + + data_a = self.make_data_netixlan( + network_id=SHARED["net_rw_ok"].id, + ixlan_id=SHARED["ixlan_rw_ok"].id, + asn=SHARED["net_rw_ok"].asn, + status="deleted", + ) + data_a.pop("net_id") + netixlan_a = NetworkIXLan.objects.create(**data_a) + + data_b = self.make_data_netixlan( + network_id=SHARED["net_rw_ok"].id, + ixlan_id=SHARED["ixlan_rw_ok"].id, + asn=SHARED["net_rw_ok"].asn, + status="deleted", + ) + data_b.pop("net_id") + netixlan_b = NetworkIXLan.objects.create(**data_b) + + # create new netixlan re-claiming ipv4 and ipv6 + # addresses from the 2 netixlans we created earlier + # ipv4 from netixlan a + # ipv6 from netixlan b + + data_c = self.make_data_netixlan( + net_id=SHARED["net_rw_ok"].id, + ixlan_id=SHARED["ixlan_rw_ok"].id, + asn=SHARED["net_rw_ok"].asn, + ) + data_c.update(ipaddr4=f"{netixlan_a.ipaddr4}", ipaddr6=f"{netixlan_b.ipaddr6}") + + r_data = self.assert_create( + self.db_org_admin, + "netixlan", + data_c, + ) + + assert r_data["ipaddr4"] == f"{netixlan_a.ipaddr4}" + assert r_data["ipaddr6"] == f"{netixlan_b.ipaddr6}" + assert r_data["id"] == netixlan_a.id + + netixlan_a.refresh_from_db() + netixlan_b.refresh_from_db() + + assert netixlan_b.ipaddr6 is None + + ########################################################################## + def test_org_admin_002_POST_PUT_netixlan_validation(self): data = self.make_data_netixlan( net_id=SHARED["net_rw_ok"].id, ixlan_id=SHARED["ixlan_rw_ok"].id diff --git a/peeringdb_server/management/commands/pdb_delete_childless_org.py b/peeringdb_server/management/commands/pdb_delete_childless_org.py new file mode 100644 index 00000000..cc3436f4 --- /dev/null +++ b/peeringdb_server/management/commands/pdb_delete_childless_org.py @@ -0,0 +1,122 @@ +""" +Delete childless org objects +""" + +import reversion +from django.conf import settings +from django.core.management.base import BaseCommand +from django.template import loader +from django.utils import timezone + +from peeringdb_server.models import Organization + + +class Command(BaseCommand): + + help = "Flags and deletes childless Organizations" + + def add_arguments(self, parser): + parser.add_argument( + "--commit", action="store_true", help="will commit the changes" + ) + + def log(self, msg): + if self.commit: + self.stdout.write(msg) + else: + self.stdout.write(f"[pretend] {msg}") + + def handle(self, *args, **options): + self.commit = options.get("commit") + self._delete_childless_org() + + @reversion.create_revision() + def _delete_childless_org(self): + + # Flag all childless orgs + + self.log("Flagging childless orgs.") + + # We give new orgs a grace period, before they are considered for cleanup + # this is done for two reasons + # + # 1. to avoid emailing new org users hours after creation + # 2. to avoid flagging new orgs before any users have been added to them + + grace_period = timezone.now() - timezone.timedelta( + days=settings.ORG_CHILDLESS_GRACE_DURATION + ) + + org_qset = Organization.objects.filter( + status="ok", flagged__isnull=True, created__lte=grace_period + ) + flagged_count = 0 + + reversion.set_comment("pdb_delete_childless_org processing") + + for org in org_qset: + + # we need to ignore sponsorship orgs, since they may only exist + # for the purpose of being a sponsor + + if org.sponsorship: + continue + + if org.is_empty: + + admins = org.admin_usergroup.user_set.all() + + self.log(f"Organization {org.name} flagged for deletion") + + if self.commit: + org.flagged = True + # Do not overwrite flagged date + if org.flagged_date is None: + org.flagged_date = timezone.now() + org.save() + + for user in admins: + + email_subject = f"Organization {org.name} flagged for deletion" + user.email_user( + email_subject, + loader.get_template( + "email/notify-org-admin-flagged.txt" + ).render( + { + "org": org, + "duration": settings.ORG_CHILDLESS_DELETE_DURATION, + } + ), + ) + flagged_count += 1 + + time_threshold = timezone.now() - timezone.timedelta( + days=settings.ORG_CHILDLESS_DELETE_DURATION + ) + org_flagged_qset = Organization.objects.filter( + status="ok", flagged=True, flagged_date__lte=time_threshold + ) + + org_delete_count = 0 + + self.log("Deleting flagged orgs") + for org in org_flagged_qset: + + # Before deleting, check again if the org is still childless + # + # Also check if org gained sponorship status + # + # Otherwise, do not delete, remove flags + + if org.is_empty and not org.sponsorship: + if self.commit: + org.delete() + org_delete_count += 1 + else: + if self.commit: + org.flagged = None + org.flagged_date = None + org.save() + self.log(f"{org_delete_count} organizations deleted") + self.log(f"{flagged_count} organizations flagged for deletion") diff --git a/peeringdb_server/management/commands/pdb_ixf_ixp_member_import.py b/peeringdb_server/management/commands/pdb_ixf_ixp_member_import.py index faeaa926..ebff17a9 100644 --- a/peeringdb_server/management/commands/pdb_ixf_ixp_member_import.py +++ b/peeringdb_server/management/commands/pdb_ixf_ixp_member_import.py @@ -210,7 +210,9 @@ class Command(BaseCommand): if process_requested is not None: ixlan_ids = [] - for ix in InternetExchange.ixf_import_request_queue(): + for ix in InternetExchange.ixf_import_request_queue( + limit=process_requested + ): if ix.id not in ixlan_ids: ixlan_ids.append(ix.id) @@ -246,7 +248,12 @@ class Command(BaseCommand): qset = net.ixlan_set_ixf_enabled else: # otherwise build ixlan queryset - qset = IXLan.objects.filter(status="ok", ixf_ixp_import_enabled=True) + + if process_requested is None: + qset = IXLan.objects.filter(status="ok", ixf_ixp_import_enabled=True) + else: + qset = IXLan.objects.filter(status="ok") + qset = qset.exclude(ixf_ixp_member_list_url__isnull=True) # filter by ids if ixlan ids were specified @@ -255,7 +262,6 @@ class Command(BaseCommand): total_log = {"data": [], "errors": []} total_notifications = [] - for ixlan in qset: self.log( "Fetching data for -ixlan{} from {}".format( @@ -267,8 +273,14 @@ class Command(BaseCommand): importer.skip_import = self.skip_import importer.cache_only = self.cache self.log(f"Processing {ixlan.ix.name} ({ixlan.id})") + success = None with transaction.atomic(): - success = importer.update(ixlan, save=self.commit, asn=asn) + success = importer.update( + ixlan, + save=self.commit, + asn=asn, + timeout=settings.IXF_FETCH_TIMEOUT, + ) self.log(json.dumps(importer.log), debug=True) self.log( "Success: {}, added: {}, updated: {}, deleted: {}".format( @@ -291,7 +303,10 @@ class Command(BaseCommand): self.store_runtime_error(inst, ixlan=ixlan) finally: if process_requested is not None: - ixlan.ix.ixf_import_request_status = "finished" + if success: + ixlan.ix.ixf_import_request_status = "finished" + else: + ixlan.ix.ixf_import_request_status = "error" ixlan.ix.save_without_timestamp() if self.preview: diff --git a/peeringdb_server/management/commands/pdb_load_data.py b/peeringdb_server/management/commands/pdb_load_data.py index bf47b242..2eec3610 100644 --- a/peeringdb_server/management/commands/pdb_load_data.py +++ b/peeringdb_server/management/commands/pdb_load_data.py @@ -1,16 +1,16 @@ """ Load initial data from another peeringdb instance using the REST API. """ +import peeringdb._fetch from confu.schema import apply_defaults from django.conf import settings from django.core.management.base import BaseCommand from django.db.models.signals import pre_save from django_peeringdb import models as djpdb_models - -import peeringdb._fetch from peeringdb import SUPPORTED_BACKENDS, resource from peeringdb.client import Client from peeringdb.config import ClientSchema + from peeringdb_server import models as pdb_models from peeringdb_server import signals diff --git a/peeringdb_server/management/commands/pdb_whois.py b/peeringdb_server/management/commands/pdb_whois.py index 17a2981d..f18dc3d8 100644 --- a/peeringdb_server/management/commands/pdb_whois.py +++ b/peeringdb_server/management/commands/pdb_whois.py @@ -5,8 +5,8 @@ import logging from django.contrib.auth.models import AnonymousUser from django_handleref import util - from peeringdb.whois import WhoisFormat + from peeringdb_server import models, serializers from peeringdb_server.util import APIPermissionsApplicator diff --git a/peeringdb_server/migrations/0077_ix_add_sales_phone_email_949.py b/peeringdb_server/migrations/0077_ix_add_sales_phone_email_949.py new file mode 100644 index 00000000..14fb03e2 --- /dev/null +++ b/peeringdb_server/migrations/0077_ix_add_sales_phone_email_949.py @@ -0,0 +1,32 @@ +# Generated by Django 3.2.7 on 2021-10-02 00:54 + +import django.core.validators +import django_inet.models +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("peeringdb_server", "0076_add_region_continent_field_1007"), + ] + + operations = [ + migrations.AddField( + model_name="internetexchange", + name="sales_email", + field=models.EmailField( + blank=True, max_length=254, verbose_name="Sales Email" + ), + ), + migrations.AddField( + model_name="internetexchange", + name="sales_phone", + field=models.CharField( + blank=True, + help_text="An E.164-formatted phone number starts with a +, followed by the country code, then the national phone number (dropping the leading 0 in most countries), without spaces or dashes between the groups of digits", + max_length=192, + verbose_name="Sales Phone", + ), + ), + ] diff --git a/peeringdb_server/migrations/0078_ix_add_error_ixf_import_status.py b/peeringdb_server/migrations/0078_ix_add_error_ixf_import_status.py new file mode 100644 index 00000000..38156ee6 --- /dev/null +++ b/peeringdb_server/migrations/0078_ix_add_error_ixf_import_status.py @@ -0,0 +1,31 @@ +# Generated by Django 3.2.7 on 2021-10-07 12:09 + +import django.core.validators +import django_inet.models +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("peeringdb_server", "0077_ix_add_sales_phone_email_949"), + ] + + operations = [ + migrations.AlterField( + model_name="internetexchange", + name="ixf_import_request_status", + field=models.CharField( + choices=[ + ("queued", "Queued"), + ("importing", "Importing"), + ("finished", "Finished"), + ("error", "Import failed"), + ], + default="queued", + help_text="The current status of the manual ix-f import request", + max_length=32, + verbose_name="Manual IX-F import status", + ), + ), + ] diff --git a/peeringdb_server/migrations/0079_org_add_flag.py b/peeringdb_server/migrations/0079_org_add_flag.py new file mode 100644 index 00000000..477652c8 --- /dev/null +++ b/peeringdb_server/migrations/0079_org_add_flag.py @@ -0,0 +1,25 @@ +# Generated by Django 3.2.7 on 2021-10-28 23:54 + +import django.core.validators +import django_inet.models +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("peeringdb_server", "0078_ix_add_error_ixf_import_status"), + ] + + operations = [ + migrations.AddField( + model_name="organization", + name="flagged", + field=models.BooleanField(null=True, blank=True), + ), + migrations.AddField( + model_name="organization", + name="flagged_date", + field=models.DateTimeField(null=True, blank=True), + ), + ] diff --git a/peeringdb_server/mock.py b/peeringdb_server/mock.py index e6b65b68..d71bc8fa 100644 --- a/peeringdb_server/mock.py +++ b/peeringdb_server/mock.py @@ -6,6 +6,7 @@ import ipaddress import uuid from django.db import models +from django.utils import timezone from peeringdb_server.models import REFTAG_MAP @@ -315,3 +316,9 @@ class Mock: def property(self, data, reftag=None): return None + + def flagged_date(self, data, reftag=None): + return timezone.now() + + def flagged(self, data, reftag=None): + return False diff --git a/peeringdb_server/models.py b/peeringdb_server/models.py index 1bc8887e..7e427058 100644 --- a/peeringdb_server/models.py +++ b/peeringdb_server/models.py @@ -820,6 +820,19 @@ class Organization(ProtectedMixin, pdb_models.OrganizationBase, GeocodeBaseMixin ), ) + # Delete childless org objects #838 + # Flag any childless orgs for deletion + flagged = models.BooleanField( + null=True, blank=True, help_text="Flag the organization for deletion" + ) + flagged_date = models.DateTimeField( + null=True, + blank=True, + auto_now=False, + auto_now_add=False, + help_text="Date when the organization was flagged", + ) + @staticmethod def autocomplete_search_fields(): return ( @@ -902,6 +915,21 @@ class Organization(ProtectedMixin, pdb_models.OrganizationBase, GeocodeBaseMixin self._not_deletable_reason = None return True + @property + def is_empty(self): + """ + Returns whether or not the organization is empty + + An empty organization means an organization that does not + have any objects with status ok or pending under it + """ + + return ( + not self.ix_set.filter(status__in=["ok", "pending"]).exists() + and not self.fac_set.filter(status__in=["ok", "pending"]).exists() + and not self.net_set.filter(status__in=["ok", "pending"]).exists() + ) + @property def owned(self): """ @@ -1635,6 +1663,7 @@ class InternetExchange(ProtectedMixin, pdb_models.InternetExchangeBase): ("queued", _("Queued")), ("importing", _("Importing")), ("finished", _("Finished")), + ("error", _("Import failed")), ), max_length=32, default="queued", @@ -2093,6 +2122,8 @@ class InternetExchange(ProtectedMixin, pdb_models.InternetExchangeBase): return "alert alert-warning" if status == "finished": return "alert alert-success" + if status == "error": + return "alert alert-danger" return "" def vq_approve(self): @@ -2137,6 +2168,7 @@ class InternetExchange(ProtectedMixin, pdb_models.InternetExchangeBase): def validate_phonenumbers(self): self.tech_phone = validate_phonenumber(self.tech_phone, self.country.code) self.policy_phone = validate_phonenumber(self.policy_phone, self.country.code) + self.sales_phone = validate_phonenumber(self.sales_phone, self.country.code) def clean(self): self.validate_phonenumbers() diff --git a/peeringdb_server/rest.py b/peeringdb_server/rest.py index a6e9ef1b..ede0ad22 100644 --- a/peeringdb_server/rest.py +++ b/peeringdb_server/rest.py @@ -49,7 +49,7 @@ from peeringdb_server.permissions import ( ) from peeringdb_server.rest_throttles import IXFImportThrottle from peeringdb_server.search import make_name_search_query -from peeringdb_server.serializers import ParentStatusException +from peeringdb_server.serializers import ASSetSerializer, ParentStatusException from peeringdb_server.util import coerce_ipaddr @@ -837,7 +837,7 @@ class ASSetViewSet(ReadOnlyMixin, viewsets.ModelViewSet): lookup_field = "asn" http_method_names = ["get"] model = Network - serializer_class = pdb_serializers.serializers.Serializer + serializer_class = ASSetSerializer def get_queryset(self): return Network.objects.filter(status="ok").exclude(irr_as_set="") diff --git a/peeringdb_server/serializers.py b/peeringdb_server/serializers.py index 48c175da..7a0b0fda 100644 --- a/peeringdb_server/serializers.py +++ b/peeringdb_server/serializers.py @@ -798,6 +798,7 @@ class ModelSerializer(serializers.ModelSerializer): depth=None, is_list=False, single=None, + selective=None, ): """ Prefetch related sets according to depth specified in the request. @@ -823,6 +824,11 @@ class ModelSerializer(serializers.ModelSerializer): o_fld = fld + # selective is specified, check that field is matched + # otherwise ignore + if selective and fld not in selective: + continue + # if the field is not to be rendered, skip it if fld not in cls.Meta.fields: continue @@ -1206,7 +1212,18 @@ class ModelSerializer(serializers.ModelSerializer): try: filters.update(status="deleted") - instance = self.Meta.model.objects.get(**filters) + if ( + self.Meta.model == NetworkIXLan + and "ipaddr4" in filters + and "ipaddr6" in filters + ): + # if unqiue constraint blocked on both ipaddr4 and ipaddr6 on netixlans + # we need to account for the fact that they might be on separate netixlans. + instance = self._handle_netixlan_reclaim( + filters["ipaddr4"], filters["ipaddr6"] + ) + else: + instance = self.Meta.model.objects.get(**filters) except self.Meta.model.DoesNotExist: raise exc except FieldError as exc: @@ -1240,6 +1257,25 @@ class ModelSerializer(serializers.ModelSerializer): else: raise + def _handle_netixlan_reclaim(self, ipaddr4, ipaddr6): + + """ + Handles logic of reclaiming ipaddresses from soft-deleted + netixlans in case where ipv4 and ipv6 are on separate netixlan objects + + Will raise a django DoesNotExist error if either ipaddress does not + exist on a deleted netixlan + """ + + netixlan_a = NetworkIXLan.objects.get(ipaddr4=ipaddr4, status="deleted") + netixlan_b = NetworkIXLan.objects.get(ipaddr6=ipaddr6, status="deleted") + instance = netixlan_a + + if netixlan_a != netixlan_b: + netixlan_b.ipaddr6 = None + netixlan_b.save() + return instance + def save(self, **kwargs): """ Entities created via API that have status pending should @@ -2444,6 +2480,13 @@ class NetworkSerializer(ModelSerializer): return value +# Create an Network serializer with no fields +class ASSetSerializer(NetworkSerializer): + class Meta: + model = Network + fields = [] + + class IXLanPrefixSerializer(ModelSerializer): """ Serializer for peeringdb_server.models.IXLanPrefix @@ -2687,6 +2730,9 @@ class InternetExchangeSerializer(ModelSerializer): tech_phone = serializers.CharField(required=False, allow_blank=True, default="") policy_phone = serializers.CharField(required=False, allow_blank=True, default="") + sales_phone = serializers.CharField(required=False, allow_blank=True, default="") + sales_email = serializers.CharField(required=False, allow_blank=True, default="") + # For the creation of the initial prefix during exchange # creation. It will be a required field during `POST` requests # but will be ignored during `PUT` so we cannot just do @@ -2737,6 +2783,8 @@ class InternetExchangeSerializer(ModelSerializer): "tech_phone", "policy_email", "policy_phone", + "sales_phone", + "sales_email", "fac_set", "ixlan_set", # "suggest", diff --git a/peeringdb_server/static/api-schema.yaml b/peeringdb_server/static/api-schema.yaml index bb5f57ec..f5f86057 100644 --- a/peeringdb_server/static/api-schema.yaml +++ b/peeringdb_server/static/api-schema.yaml @@ -6,12 +6,12 @@ paths: /api/fac: get: operationId: list fac - description: "Retrieves a list of `fac` type objects\n\n## Facility (Datacenter)\ - \ \n\nIdentified by the `fac` tag.\n\n### Parent relationship:\n\n- `org`\ - \ organization\n\n### Relationship(s):\n\n- `ixfac` exchange / facility presence\n\ - - `netfac` network / facility presence\n\n\n## List objects\n\n### Querying\n\ - \nYou may query the resultset by passing field names as url parameters\n\n\ - ### Numeric Queries\n\nOn numeric fields you can suffix the field names with\ + description: "Retrieves a list of `fac` type objects\n\n## Facility (Datacenter)\n\ + \nIdentified by the `fac` tag.\n\n### Parent relationship:\n\n- `org` organization\n\ + \n### Relationship(s):\n\n- `ixfac` exchange / facility presence\n- `netfac`\ + \ network / facility presence\n\n\n## List objects\n\n### Querying\n\nYou\ + \ may query the resultset by passing field names as url parameters\n\n###\ + \ Numeric Queries\n\nOn numeric fields you can suffix the field names with\ \ the following filters:\n\n- \\_\\_lt : less-than\n- \\_\\_lte : less-than-equal\n\ - \\_\\_gt : greater-than\n- \\_\\_gte : greater-than-equal\n- \\_\\_in :\ \ value inside set of values (comma separated)\n\n**examples**\n\n ?__lt=10\n\ @@ -25,16 +25,17 @@ paths: \ to retrieve all\nobjects updated since then. Note that this result will\ \ contain objects that were\ndeleted in that timeframe as well - you can spot\ \ them by checking for status \"deleted\"\n\n**example**\n\n ?since=1443414678\n\ - \n### Nested data\n\nAny field ending in the suffix **_set** is a list of\ - \ objects in a relationship with the parent\nobject, you can expand those\ - \ lists with the 'depth' parameter as explained below.\n\nThe naming schema\ - \ of the field will always tell you which type of object the set is holding\n\ - and will correspond with the object's endpoint on the API\n\n _set\n\ - \nSo a set called 'net_set' will hold Network objects (api endpoint /net)\n\ - \n### Depth\n\nNested sets will not be loaded (any field ending with the _set\ - \ suffix) unless the 'depth'\nparameter is passed in the request URL.\n\n\ - Depth can be one of three values:\n\n - 1 : expand sets into ids (slow)\n\ - \ - 2 : expand sets into objects (slower)\n - 0 : dont expand sets at all\ + \n### Nested data\n\nAny field ending in the suffix **_set** (with the exception\ + \ of 'irr_as_set') is a list of objects in a relationship with the parent\n\ + object, you can expand those lists with the 'depth' parameter as explained\ + \ below.\n\nThe naming schema of the field will always tell you which type\ + \ of object the set is holding\nand will correspond with the object's endpoint\ + \ on the API\n\n _set\n\nSo a set called 'net_set' will hold\ + \ Network objects (api endpoint /net)\n\n### Depth\n\nNested sets will not\ + \ be loaded (any field ending with the _set suffix, with the exception of\ + \ 'irr_as_set') unless the 'depth'\nparameter is passed in the request URL.\n\ + \nDepth can be one of three values:\n\n - 1 : expand sets into ids (slow)\n\ + \ - 2 : expand sets into objects (slower)\n - 0 : don't expand sets at all\ \ (default behaviour)\n\n**example**\n\n ?depth=1\n\n### Cached Responses\n\ \nAny request that does not require lookups will be served a cached result.\ \ Cache is updated approximately every 15 minutes.\n\nYou can spot cached\ @@ -69,6 +70,31 @@ paths: description: 'Filter results by matching a value against this field. + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: aka + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: available_voltage_services + in: query + description: 'The alternating current voltage available to users of the facility + either directly from the landlord or delivered by the utility separately. + + + Filter results by matching a value against this field. + + + `48 VDC`, `120 VAC`, `208 VAC`, `240 VAC`, `480 VAC` + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' required: false schema: @@ -141,6 +167,25 @@ paths: default: 0 minimum: 0 maximum: 2 + - name: diverse_serving_substations + in: query + description: 'Two separate and distinct paths to individual substations which + should maintain a separated path back to one or more utility generator stations. + + + Filter results by matching a value against this field.' + required: false + schema: + type: integer + - name: floor + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string - name: geocode_date in: query description: 'Last time of attempted geocode @@ -153,22 +198,10 @@ paths: required: false schema: type: date-time - - name: geocode_error - in: query - description: 'Error message of previous geocode attempt - - - Filter results by matching a value against this field. - - - Supported filter suffixes: `__startswith`, `__contains`, `__in`' - required: false - schema: - type: string - name: geocode_status in: query - description: 'Has this object''s latitude and longitude been syncronized to - it''s address fields + description: 'Has this object''s address been normalized with a call to the + Google Maps API Filter results by matching a value against this field.' @@ -180,6 +213,18 @@ paths: description: 'Filter results by matching a value against this field. + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: integer + - name: ix_count + in: query + description: 'number of exchanges at this facility + + + Filter results by matching a value against this field. + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' required: false schema: @@ -218,6 +263,27 @@ paths: required: false schema: type: string + - name: name_long + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: net_count + in: query + description: 'number of networks at this facility + + + Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: integer - name: net_count in: query description: 'Number of networks present at this facility @@ -271,6 +337,15 @@ paths: description: 'Filter results by matching a value against this field. + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: org__aka + in: query + description: 'Filter results by matching a value against this field. + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' required: false schema: @@ -325,6 +400,58 @@ paths: required: false schema: type: date-time + - name: org__flagged + in: query + description: 'Flag the organization for deletion + + + Filter results by matching a value against this field.' + required: false + schema: + type: integer + - name: org__flagged_date + in: query + description: 'Date when the organization was flagged + + + Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: date-time + - name: org__floor + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: org__geocode_date + in: query + description: 'Last time of attempted geocode + + + Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: date-time + - name: org__geocode_status + in: query + description: 'Has this object''s address been normalized with a call to the + Google Maps API + + + Filter results by matching a value against this field.' + required: false + schema: + type: integer - name: org__id in: query description: 'Filter results by matching a value against this field. @@ -339,6 +466,15 @@ paths: description: 'Filter results by matching a value against this field. + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: org__name_long + in: query + description: 'Filter results by matching a value against this field. + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' required: false schema: @@ -366,6 +502,15 @@ paths: description: 'Filter results by matching a value against this field. + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: org__suite + in: query + description: 'Filter results by matching a value against this field. + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' required: false schema: @@ -402,6 +547,36 @@ paths: description: 'Filter results by matching a value against this field. + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: property + in: query + description: 'A property owner is the individual or entity that has title + to the property. A lessee is a user of a property who has a lease, an agreement, + with the owner of the property. + + + Filter results by matching a value against this field. + + + ``, `Owner`, `Lessee` + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: region_continent + in: query + description: 'Filter results by matching a value against this field. + + + `North America`, `Asia Pacific`, `Europe`, `South America`, `Africa`, `Australia`, + `Middle East` + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' required: false schema: @@ -426,7 +601,12 @@ paths: type: string - name: sales_phone in: query - description: 'Filter results by matching a value against this field. + description: 'An E.164-formatted phone number starts with a +, followed by + the country code, then the national phone number (dropping the leading 0 + in most countries), without spaces or dashes between the groups of digits + + + Filter results by matching a value against this field. Supported filter suffixes: `__startswith`, `__contains`, `__in`' @@ -461,6 +641,15 @@ paths: description: 'Filter results by matching a value against this field. + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: suite + in: query + description: 'Filter results by matching a value against this field. + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' required: false schema: @@ -476,7 +665,12 @@ paths: type: string - name: tech_phone in: query - description: 'Filter results by matching a value against this field. + description: 'An E.164-formatted phone number starts with a +, followed by + the country code, then the national phone number (dropping the leading 0 + in most countries), without spaces or dashes between the groups of digits + + + Filter results by matching a value against this field. Supported filter suffixes: `__startswith`, `__contains`, `__in`' @@ -526,392 +720,138 @@ paths: schema: type: array items: - properties: - id: - type: integer - readOnly: true - org_id: - type: integer - org_name: - type: string - readOnly: true - org: - type: string - readOnly: true - name: - type: string - maxLength: 255 - website: - type: string - format: uri - pattern: "^(?:[a-z0-9\\.\\-\\+]*)://(?:[^\\s:@/]+(?::[^\\s:@/]*)?@)?(?:(?:25[0-5]|2[0-4]\\\ - d|[0-1]?\\d?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}|\\\ - [[0-9a-f:\\.]+\\]|([a-z\xA1-\uFFFF0-9](?:[a-z\xA1-\uFFFF0-9-]{0,61}[a-z\xA1\ - -\uFFFF0-9])?(?:\\.(?!-)[a-z\xA1-\uFFFF0-9-]{1,63}(?_set\n\ - \nSo a set called 'net_set' will hold Network objects (api endpoint /net)\n\ - \n### Depth\n\nNested sets will not be loaded (any field ending with the _set\ - \ suffix) unless the 'depth'\nparameter is passed in the request URL.\n\n\ - Depth can be one of three values:\n\n - 1 : expand sets into ids (slow)\n\ - \ - 2 : expand sets into objects (slower)\n - 0 : dont expand sets at all\ + \n### Nested data\n\nAny field ending in the suffix **_set** (with the exception\ + \ of 'irr_as_set') is a list of objects in a relationship with the parent\n\ + object, you can expand those lists with the 'depth' parameter as explained\ + \ below.\n\nThe naming schema of the field will always tell you which type\ + \ of object the set is holding\nand will correspond with the object's endpoint\ + \ on the API\n\n _set\n\nSo a set called 'net_set' will hold\ + \ Network objects (api endpoint /net)\n\n### Depth\n\nNested sets will not\ + \ be loaded (any field ending with the _set suffix, with the exception of\ + \ 'irr_as_set') unless the 'depth'\nparameter is passed in the request URL.\n\ + \nDepth can be one of three values:\n\n - 1 : expand sets into ids (slow)\n\ + \ - 2 : expand sets into objects (slower)\n - 0 : don't expand sets at all\ \ (default behaviour)\n\n**example**\n\n ?depth=1\n\n### Cached Responses\n\ \nAny request that does not require lookups will be served a cached result.\ \ Cache is updated approximately every 15 minutes.\n\nYou can spot cached\ @@ -3342,6 +2242,15 @@ paths: \ - first page\n ?updated__gt=2011-01-01&depth=1&limit=250&skip=250 - second\ \ page\n ?updated__gt=2011-01-01&depth=1&limit=250&skip=500 - third page\n" parameters: + - name: aka + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string - name: city in: query description: 'Filter results by matching a value against this field. @@ -3410,6 +2319,18 @@ paths: required: false schema: type: number + - name: fac_count + in: query + description: 'number of facilities at this exchange + + + Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: integer - name: id in: query description: 'Filter results by matching a value against this field. @@ -3419,6 +2340,185 @@ paths: required: false schema: type: integer + - name: ixf_import_request + in: query + description: 'Date of most recent manual import request + + + Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: date-time + - name: ixf_import_request_status + in: query + description: 'The current status of the manual ix-f import request + + + Filter results by matching a value against this field. + + + `queued`, `importing`, `finished`, `error` + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: ixf_import_request_user + in: query + description: 'The user that triggered the manual ix-f import request + + + Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: integer + - name: ixf_import_request_user__created + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: date-time + - name: ixf_import_request_user__date_joined + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: date-time + - name: ixf_import_request_user__email + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: ixf_import_request_user__first_name + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: ixf_import_request_user__id + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: integer + - name: ixf_import_request_user__is_active + in: query + description: 'Designates whether this user should be treated as active. Unselect + this instead of deleting accounts. + + + Filter results by matching a value against this field.' + required: false + schema: + type: integer + - name: ixf_import_request_user__is_staff + in: query + description: 'Designates whether the user can log into admin site. + + + Filter results by matching a value against this field.' + required: false + schema: + type: integer + - name: ixf_import_request_user__is_superuser + in: query + description: 'Designates that this user has all permissions without explicitly + assigning them. + + + Filter results by matching a value against this field.' + required: false + schema: + type: integer + - name: ixf_import_request_user__last_login + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: date-time + - name: ixf_import_request_user__last_name + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: ixf_import_request_user__locale + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: ixf_import_request_user__password + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: ixf_import_request_user__status + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: ixf_import_request_user__updated + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: date-time + - name: ixf_import_request_user__username + in: query + description: 'Required. Letters, digits and [@.+-/_=|] only. + + + Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string - name: ixf_last_import in: query description: 'Filter results by matching a value against this field. @@ -3501,6 +2601,18 @@ paths: required: false schema: type: number + - name: net_count + in: query + description: 'number of networks at this exchange + + + Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: integer - name: net_count in: query description: 'Number of networks present at this exchange @@ -3545,6 +2657,15 @@ paths: description: 'Filter results by matching a value against this field. + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: org__aka + in: query + description: 'Filter results by matching a value against this field. + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' required: false schema: @@ -3599,6 +2720,58 @@ paths: required: false schema: type: date-time + - name: org__flagged + in: query + description: 'Flag the organization for deletion + + + Filter results by matching a value against this field.' + required: false + schema: + type: integer + - name: org__flagged_date + in: query + description: 'Date when the organization was flagged + + + Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: date-time + - name: org__floor + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: org__geocode_date + in: query + description: 'Last time of attempted geocode + + + Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: date-time + - name: org__geocode_status + in: query + description: 'Has this object''s address been normalized with a call to the + Google Maps API + + + Filter results by matching a value against this field.' + required: false + schema: + type: integer - name: org__id in: query description: 'Filter results by matching a value against this field. @@ -3613,6 +2786,15 @@ paths: description: 'Filter results by matching a value against this field. + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: org__name_long + in: query + description: 'Filter results by matching a value against this field. + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' required: false schema: @@ -3640,6 +2822,15 @@ paths: description: 'Filter results by matching a value against this field. + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: org__suite + in: query + description: 'Filter results by matching a value against this field. + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' required: false schema: @@ -3691,7 +2882,12 @@ paths: type: string - name: policy_phone in: query - description: 'Filter results by matching a value against this field. + description: 'An E.164-formatted phone number starts with a +, followed by + the country code, then the national phone number (dropping the leading 0 + in most countries), without spaces or dashes between the groups of digits + + + Filter results by matching a value against this field. Supported filter suffixes: `__startswith`, `__contains`, `__in`' @@ -3725,6 +2921,42 @@ paths: `Middle East` + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: sales_email + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: sales_phone + in: query + description: 'An E.164-formatted phone number starts with a +, followed by + the country code, then the national phone number (dropping the leading 0 + in most countries), without spaces or dashes between the groups of digits + + + Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: service_level + in: query + description: 'Filter results by matching a value against this field. + + + ``, `Not Disclosed`, `Best Effort (no SLA)`, `Normal Business Hours`, `24/7 + Support` + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' required: false schema: @@ -3762,10 +2994,28 @@ paths: schema: type: string - name: tech_phone + in: query + description: 'An E.164-formatted phone number starts with a +, followed by + the country code, then the national phone number (dropping the leading 0 + in most countries), without spaces or dashes between the groups of digits + + + Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: terms in: query description: 'Filter results by matching a value against this field. + ``, `Not Disclosed`, `No Commercial Terms`, `Bundled With Other Services`, + `Non-recurring Fees Only`, `Recurring Fees` + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' required: false schema: @@ -3813,1143 +3063,10 @@ paths: schema: type: array items: - properties: - id: - type: integer - readOnly: true - org_id: - type: integer - org: - type: string - readOnly: true - name: - type: string - maxLength: 64 - name_long: - type: string - maxLength: 254 - city: - type: string - maxLength: 192 - country: - enum: - - AF - - AX - - AL - - DZ - - AS - - AD - - AO - - AI - - AQ - - AG - - AR - - AM - - AW - - AU - - AT - - AZ - - BS - - BH - - BD - - BB - - BY - - BE - - BZ - - BJ - - BM - - BT - - BO - - BQ - - BA - - BW - - BV - - BR - - IO - - BN - - BG - - BF - - BI - - CV - - KH - - CM - - CA - - KY - - CF - - TD - - CL - - CN - - CX - - CC - - CO - - KM - - CG - - CD - - CK - - CR - - CI - - HR - - CU - - CW - - CY - - CZ - - DK - - DJ - - DM - - DO - - EC - - EG - - SV - - GQ - - ER - - EE - - SZ - - ET - - FK - - FO - - FJ - - FI - - FR - - GF - - PF - - TF - - GA - - GM - - GE - - DE - - GH - - GI - - GR - - GL - - GD - - GP - - GU - - GT - - GG - - GN - - GW - - GY - - HT - - HM - - VA - - HN - - HK - - HU - - IS - - IN - - ID - - IR - - IQ - - IE - - IM - - IL - - IT - - JM - - JP - - JE - - JO - - KZ - - KE - - KI - - XK - - KW - - KG - - LA - - LV - - LB - - LS - - LR - - LY - - LI - - LT - - LU - - MO - - MG - - MW - - MY - - MV - - ML - - MT - - MH - - MQ - - MR - - MU - - YT - - MX - - FM - - MD - - MC - - MN - - ME - - MS - - MA - - MZ - - MM - - NA - - NR - - NP - - NL - - NC - - NZ - - NI - - NE - - NG - - NU - - NF - - KP - - MK - - MP - - 'NO' - - OM - - PK - - PW - - PS - - PA - - PG - - PY - - PE - - PH - - PN - - PL - - PT - - PR - - QA - - RE - - RO - - RU - - RW - - BL - - SH - - KN - - LC - - MF - - PM - - VC - - WS - - SM - - ST - - SA - - SN - - RS - - SC - - SL - - SG - - SX - - SK - - SI - - SB - - SO - - ZA - - GS - - KR - - SS - - ES - - LK - - SD - - SR - - SJ - - SE - - CH - - SY - - TW - - TJ - - TZ - - TH - - TL - - TG - - TK - - TO - - TT - - TN - - TR - - TM - - TC - - TV - - UG - - UA - - AE - - GB - - UM - - US - - UY - - UZ - - VU - - VE - - VN - - VG - - VI - - WF - - EH - - YE - - ZM - - ZW - region_continent: - enum: - - North America - - Asia Pacific - - Europe - - South America - - Africa - - Australia - - Middle East - media: - enum: - - Ethernet - - ATM - - Multiple - notes: - type: string - proto_unicast: - type: boolean - proto_multicast: - type: boolean - proto_ipv6: - type: boolean - website: - type: string - format: uri - pattern: "^(?:[a-z0-9\\.\\-\\+]*)://(?:[^\\s:@/]+(?::[^\\s:@/]*)?@)?(?:(?:25[0-5]|2[0-4]\\\ - d|[0-1]?\\d?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}|\\\ - [[0-9a-f:\\.]+\\]|([a-z\xA1-\uFFFF0-9](?:[a-z\xA1-\uFFFF0-9-]{0,61}[a-z\xA1\ - -\uFFFF0-9])?(?:\\.(?!-)[a-z\xA1-\uFFFF0-9-]{1,63}(?_set\n\nSo a set\ - \ called 'net_set' will hold Network objects (api endpoint /net)\n\n### Depth\n\ - \nNested sets will not be loaded (any field ending with the _set suffix) unless\ + \ data\n\nAny field ending in the suffix **_set** (with the exception of 'irr_as_set')\ + \ is a list of objects in a relationship with the parent\nobject, you can\ + \ expand those lists with the 'depth' parameter as explained below.\n\nThe\ + \ naming schema of the field will always tell you which type of object the\ + \ set is holding\nand will correspond with the object's endpoint on the API\n\ + \n _set\n\nSo a set called 'net_set' will hold Network objects\ + \ (api endpoint /net)\n\n### Depth\n\nNested sets will not be loaded (any\ + \ field ending with the _set suffix, with the exception of 'irr_as_set') unless\ \ the 'depth'\nparameter is passed in the request URL.\n\nDepth can be one\ \ of three values:\n\n - 1 : expand sets into ids (slow)\n - 2 : expand\ - \ sets into objects (slower)\n - 0 : dont expand sets at all (default behaviour)\n\ + \ sets into objects (slower)\n - 0 : don't expand sets at all (default behaviour)\n\ \n**example**\n\n ?depth=1\n\n### Cached Responses\n\nAny request that\ \ does not require lookups will be served a cached result. Cache is updated\ \ approximately every 15 minutes.\n\nYou can spot cached responses by checking\ @@ -10822,6 +7337,31 @@ paths: description: 'Filter results by matching a value against this field. + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: fac__aka + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: fac__available_voltage_services + in: query + description: 'The alternating current voltage available to users of the facility + either directly from the landlord or delivered by the utility separately. + + + Filter results by matching a value against this field. + + + `48 VDC`, `120 VAC`, `208 VAC`, `240 VAC`, `480 VAC` + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' required: false schema: @@ -10885,6 +7425,25 @@ paths: required: false schema: type: date-time + - name: fac__diverse_serving_substations + in: query + description: 'Two separate and distinct paths to individual substations which + should maintain a separated path back to one or more utility generator stations. + + + Filter results by matching a value against this field.' + required: false + schema: + type: integer + - name: fac__floor + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string - name: fac__geocode_date in: query description: 'Last time of attempted geocode @@ -10897,22 +7456,10 @@ paths: required: false schema: type: date-time - - name: fac__geocode_error - in: query - description: 'Error message of previous geocode attempt - - - Filter results by matching a value against this field. - - - Supported filter suffixes: `__startswith`, `__contains`, `__in`' - required: false - schema: - type: string - name: fac__geocode_status in: query - description: 'Has this object''s latitude and longitude been syncronized to - it''s address fields + description: 'Has this object''s address been normalized with a call to the + Google Maps API Filter results by matching a value against this field.' @@ -10924,6 +7471,18 @@ paths: description: 'Filter results by matching a value against this field. + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: integer + - name: fac__ix_count + in: query + description: 'number of exchanges at this facility + + + Filter results by matching a value against this field. + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' required: false schema: @@ -10955,6 +7514,27 @@ paths: required: false schema: type: string + - name: fac__name_long + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: fac__net_count + in: query + description: 'number of networks at this facility + + + Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: integer - name: fac__notes in: query description: 'Filter results by matching a value against this field. @@ -10969,6 +7549,36 @@ paths: description: 'Filter results by matching a value against this field. + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: fac__property + in: query + description: 'A property owner is the individual or entity that has title + to the property. A lessee is a user of a property who has a lease, an agreement, + with the owner of the property. + + + Filter results by matching a value against this field. + + + ``, `Owner`, `Lessee` + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: fac__region_continent + in: query + description: 'Filter results by matching a value against this field. + + + `North America`, `Asia Pacific`, `Europe`, `South America`, `Africa`, `Australia`, + `Middle East` + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' required: false schema: @@ -10993,7 +7603,12 @@ paths: type: string - name: fac__sales_phone in: query - description: 'Filter results by matching a value against this field. + description: 'An E.164-formatted phone number starts with a +, followed by + the country code, then the national phone number (dropping the leading 0 + in most countries), without spaces or dashes between the groups of digits + + + Filter results by matching a value against this field. Supported filter suffixes: `__startswith`, `__contains`, `__in`' @@ -11014,6 +7629,15 @@ paths: description: 'Filter results by matching a value against this field. + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: fac__suite + in: query + description: 'Filter results by matching a value against this field. + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' required: false schema: @@ -11029,7 +7653,12 @@ paths: type: string - name: fac__tech_phone in: query - description: 'Filter results by matching a value against this field. + description: 'An E.164-formatted phone number starts with a +, followed by + the country code, then the national phone number (dropping the leading 0 + in most countries), without spaces or dashes between the groups of digits + + + Filter results by matching a value against this field. Supported filter suffixes: `__startswith`, `__contains`, `__in`' @@ -11099,6 +7728,15 @@ paths: required: false schema: type: integer + - name: ix__aka + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string - name: ix__city in: query description: 'Filter results by matching a value against this field. @@ -11149,6 +7787,18 @@ paths: required: false schema: type: date-time + - name: ix__fac_count + in: query + description: 'number of facilities at this exchange + + + Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: integer - name: ix__id in: query description: 'Filter results by matching a value against this field. @@ -11158,6 +7808,33 @@ paths: required: false schema: type: integer + - name: ix__ixf_import_request + in: query + description: 'Date of most recent manual import request + + + Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: date-time + - name: ix__ixf_import_request_status + in: query + description: 'The current status of the manual ix-f import request + + + Filter results by matching a value against this field. + + + `queued`, `importing`, `finished`, `error` + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string - name: ix__ixf_last_import in: query description: 'Filter results by matching a value against this field. @@ -11206,6 +7883,18 @@ paths: required: false schema: type: string + - name: ix__net_count + in: query + description: 'number of networks at this exchange + + + Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: integer - name: ix__notes in: query description: 'Filter results by matching a value against this field. @@ -11226,7 +7915,12 @@ paths: type: string - name: ix__policy_phone in: query - description: 'Filter results by matching a value against this field. + description: 'An E.164-formatted phone number starts with a +, followed by + the country code, then the national phone number (dropping the leading 0 + in most countries), without spaces or dashes between the groups of digits + + + Filter results by matching a value against this field. Supported filter suffixes: `__startswith`, `__contains`, `__in`' @@ -11260,6 +7954,42 @@ paths: `Middle East` + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: ix__sales_email + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: ix__sales_phone + in: query + description: 'An E.164-formatted phone number starts with a +, followed by + the country code, then the national phone number (dropping the leading 0 + in most countries), without spaces or dashes between the groups of digits + + + Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: ix__service_level + in: query + description: 'Filter results by matching a value against this field. + + + ``, `Not Disclosed`, `Best Effort (no SLA)`, `Normal Business Hours`, `24/7 + Support` + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' required: false schema: @@ -11283,10 +8013,28 @@ paths: schema: type: string - name: ix__tech_phone + in: query + description: 'An E.164-formatted phone number starts with a +, followed by + the country code, then the national phone number (dropping the leading 0 + in most countries), without spaces or dashes between the groups of digits + + + Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: ix__terms in: query description: 'Filter results by matching a value against this field. + ``, `Not Disclosed`, `No Commercial Terms`, `Bundled With Other Services`, + `Non-recurring Fees Only`, `Recurring Fees` + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' required: false schema: @@ -11382,61 +8130,114 @@ paths: schema: type: array items: - properties: - id: - type: integer - readOnly: true - ix_id: - type: integer - ix: - type: string - readOnly: true - fac_id: - type: integer - fac: - type: string - readOnly: true - created: - type: string - format: date-time - readOnly: true - updated: - type: string - format: date-time - readOnly: true - status: - type: string - maxLength: 255 - required: - - ix_id - - fac_id + $ref: '#/components/schemas/InternetExchangeFacility' description: '' + tags: + - api post: operationId: create ixfac - description: "Creates a new `ixfac` type object.\n\n## Internet Exchange / Facility\ - \ presence \n\nIdentified by the `ixfac` tag.\n\n### Parent relationship:\n\ - \n- `ix` internet exchange\n\n### Relationship(s):\n\n- `fac` facility\n\n\ - \n## Creating objects\n\n### Status `pending`\n\nSome object types will be\ - \ flagged as `pending` until they have been reviewed and approved by peeringdb\ - \ staff.\n\nCurrently this is the case for:\n\n\n- `org` organizations (only\ - \ administrative staff users are currently allowed to create organizations)\n\ - - `fac` facilities\n- `net` networks\n- `ix` exchanges\n- `ixpfx` prefixes\ - \ (if part of a new exchange)\n- `ixlan` exchange networks (if part of a new\ - \ exchange)\n\n### Permissions\n\nTo be able to create an object, the requesting\ - \ user requires `create` permissions to one of the\nobject's parents in the\ - \ relationship hierarchy.\n\nFor example to create a `net` type object, the\ - \ user needs to be permissioned to create in the organzation\nthat is to be\ - \ the network's holder entity.\n" + description: 'Creates a new `ixfac` type object. + + + ## Internet Exchange / Facility presence + + + Identified by the `ixfac` tag. + + + ### Parent relationship: + + + - `ix` internet exchange + + + ### Relationship(s): + + + - `fac` facility + + + + ## Creating objects + + + ### Status `pending` + + + Some object types will be flagged as `pending` until they have been reviewed + and approved by peeringdb staff. + + + Currently this is the case for: + + + + - `org` organizations (only administrative staff users are currently allowed + to create organizations) + + - `fac` facilities + + - `net` networks + + - `ix` exchanges + + - `ixpfx` prefixes (if part of a new exchange) + + - `ixlan` exchange networks (if part of a new exchange) + + + ### Permissions + + + To be able to create an object, the requesting user requires `create` permissions + to one of the + + object''s parents in the relationship hierarchy. + + + For example to create a `net` type object, the user needs to be permissioned + to create in the organization + + that is to be the network''s holder entity. + + ' parameters: [] requestBody: content: application/json: - schema: &id007 + schema: + type: object properties: + id: + type: integer + readOnly: true + name: + type: string + readOnly: true + city: + type: string + readOnly: true + country: + type: string + readOnly: true ix_id: type: integer + ix: + type: string + readOnly: true fac_id: type: integer + fac: + type: string + readOnly: true + created: + type: string + format: date-time + readOnly: true + updated: + type: string + format: date-time + readOnly: true status: type: string maxLength: 255 @@ -11444,55 +8245,32 @@ paths: - ix_id - fac_id application/x-www-form-urlencoded: - schema: *id007 + schema: + $ref: '#/components/schemas/InternetExchangeFacility' multipart/form-data: - schema: *id007 + schema: + $ref: '#/components/schemas/InternetExchangeFacility' responses: - '200': + '201': content: application/json: schema: - properties: - id: - type: integer - readOnly: true - ix_id: - type: integer - ix: - type: string - readOnly: true - fac_id: - type: integer - fac: - type: string - readOnly: true - created: - type: string - format: date-time - readOnly: true - updated: - type: string - format: date-time - readOnly: true - status: - type: string - maxLength: 255 - required: - - ix_id - - fac_id + $ref: '#/components/schemas/InternetExchangeFacility' description: '' + tags: + - api /api/ixfac/{id}: get: operationId: retrieve ixfac description: "Retrieves a single `ixfac` type object by id\n\n## Internet Exchange\ - \ / Facility presence \n\nIdentified by the `ixfac` tag.\n\n### Parent relationship:\n\ + \ / Facility presence\n\nIdentified by the `ixfac` tag.\n\n### Parent relationship:\n\ \n- `ix` internet exchange\n\n### Relationship(s):\n\n- `fac` facility\n\n\ \n## Retrieve a single object\n\n### Depth\n\nNested sets will not be expanded\ - \ (any field ending with the _set suffix) unless the 'depth'\nparameter is\ - \ passed in the request URL.\n\nDepth can be one of three values:\n\n - 1\ - \ : expand sets into ids (slow)\n - 2 : expand sets into objects (slower)\n\ - \ - 0 : dont expand sets at all (default behaviour)\n\n**example**\n\n \ - \ ?depth=1\n\n\n" + \ (any field ending with the _set suffix, with the exception of 'irr_as_set')\ + \ unless the 'depth'\nparameter is passed in the request URL.\n\nDepth can\ + \ be one of three values:\n\n - 1 : expand sets into ids (slow)\n - 2 :\ + \ expand sets into objects (slower)\n - 0 : don't expand sets at all (default\ + \ behaviour)\n\n**example**\n\n ?depth=1\n" parameters: - name: id in: path @@ -11514,43 +8292,44 @@ paths: content: application/json: schema: - properties: - id: - type: integer - readOnly: true - ix_id: - type: integer - ix: - type: string - readOnly: true - fac_id: - type: integer - fac: - type: string - readOnly: true - created: - type: string - format: date-time - readOnly: true - updated: - type: string - format: date-time - readOnly: true - status: - type: string - maxLength: 255 - required: - - ix_id - - fac_id + $ref: '#/components/schemas/InternetExchangeFacility' description: '' + tags: + - api put: operationId: update ixfac - description: "Updates an existing `ixfac` type object.\n\n## Internet Exchange\ - \ / Facility presence \n\nIdentified by the `ixfac` tag.\n\n### Parent relationship:\n\ - \n- `ix` internet exchange\n\n### Relationship(s):\n\n- `fac` facility\n\n\ - \n## Update existing objects\n\n### Permissions\n\nIn order to update an object\ - \ the requesting user requires `update` permissions to the object itself or\ - \ one of the parent relationships in the object hierarchy\n" + description: 'Updates an existing `ixfac` type object. + + + ## Internet Exchange / Facility presence + + + Identified by the `ixfac` tag. + + + ### Parent relationship: + + + - `ix` internet exchange + + + ### Relationship(s): + + + - `fac` facility + + + + ## Update existing objects + + + ### Permissions + + + In order to update an object the requesting user requires `update` permissions + to the object itself or one of the parent relationships in the object hierarchy + + ' parameters: - name: id in: path @@ -11561,12 +8340,39 @@ paths: requestBody: content: application/json: - schema: &id008 + schema: + type: object properties: + id: + type: integer + readOnly: true + name: + type: string + readOnly: true + city: + type: string + readOnly: true + country: + type: string + readOnly: true ix_id: type: integer + ix: + type: string + readOnly: true fac_id: type: integer + fac: + type: string + readOnly: true + created: + type: string + format: date-time + readOnly: true + updated: + type: string + format: date-time + readOnly: true status: type: string maxLength: 255 @@ -11574,48 +8380,43 @@ paths: - ix_id - fac_id application/x-www-form-urlencoded: - schema: *id008 + schema: + $ref: '#/components/schemas/InternetExchangeFacility' multipart/form-data: - schema: *id008 + schema: + $ref: '#/components/schemas/InternetExchangeFacility' responses: '200': content: application/json: schema: - properties: - id: - type: integer - readOnly: true - ix_id: - type: integer - ix: - type: string - readOnly: true - fac_id: - type: integer - fac: - type: string - readOnly: true - created: - type: string - format: date-time - readOnly: true - updated: - type: string - format: date-time - readOnly: true - status: - type: string - maxLength: 255 - required: - - ix_id - - fac_id + $ref: '#/components/schemas/InternetExchangeFacility' description: '' + tags: + - api patch: operationId: patch ixfac - description: "PATCH (partial update) is currently disabled\n\n## Internet Exchange\ - \ / Facility presence \n\nIdentified by the `ixfac` tag.\n\n### Parent relationship:\n\ - \n- `ix` internet exchange\n\n### Relationship(s):\n\n- `fac` facility\n" + description: 'PATCH (partial update) is currently disabled. + + + ## Internet Exchange / Facility presence + + + Identified by the `ixfac` tag. + + + ### Parent relationship: + + + - `ix` internet exchange + + + ### Relationship(s): + + + - `fac` facility + + ' parameters: - name: id in: path @@ -11626,59 +8427,87 @@ paths: requestBody: content: application/json: - schema: &id009 + schema: + type: object properties: + id: + type: integer + readOnly: true + name: + type: string + readOnly: true + city: + type: string + readOnly: true + country: + type: string + readOnly: true ix_id: type: integer + ix: + type: string + readOnly: true fac_id: type: integer + fac: + type: string + readOnly: true + created: + type: string + format: date-time + readOnly: true + updated: + type: string + format: date-time + readOnly: true status: type: string maxLength: 255 + required: + - ix_id + - fac_id application/x-www-form-urlencoded: - schema: *id009 + schema: + $ref: '#/components/schemas/InternetExchangeFacility' multipart/form-data: - schema: *id009 + schema: + $ref: '#/components/schemas/InternetExchangeFacility' responses: '200': content: application/json: schema: - properties: - id: - type: integer - readOnly: true - ix_id: - type: integer - ix: - type: string - readOnly: true - fac_id: - type: integer - fac: - type: string - readOnly: true - created: - type: string - format: date-time - readOnly: true - updated: - type: string - format: date-time - readOnly: true - status: - type: string - maxLength: 255 - required: - - ix_id - - fac_id + $ref: '#/components/schemas/InternetExchangeFacility' description: '' + tags: + - api delete: operationId: delete ixfac - description: "Marks an `ixfac` type object as `deleted`.\n\n## Internet Exchange\ - \ / Facility presence \n\nIdentified by the `ixfac` tag.\n\n### Parent relationship:\n\ - \n- `ix` internet exchange\n\n### Relationship(s):\n\n- `fac` facility\n\n\ - \n## Deleting objects\n" + description: 'Marks an `ixfac` type object as `deleted`. + + + ## Internet Exchange / Facility presence + + + Identified by the `ixfac` tag. + + + ### Parent relationship: + + + - `ix` internet exchange + + + ### Relationship(s): + + + - `fac` facility + + + + ## Deleting objects + + ' parameters: - name: id in: path @@ -11689,6 +8518,8 @@ paths: responses: '204': description: '' + tags: + - api /api/ixlan: get: operationId: list ixlan @@ -11711,16 +8542,17 @@ paths: \ to retrieve all\nobjects updated since then. Note that this result will\ \ contain objects that were\ndeleted in that timeframe as well - you can spot\ \ them by checking for status \"deleted\"\n\n**example**\n\n ?since=1443414678\n\ - \n### Nested data\n\nAny field ending in the suffix **_set** is a list of\ - \ objects in a relationship with the parent\nobject, you can expand those\ - \ lists with the 'depth' parameter as explained below.\n\nThe naming schema\ - \ of the field will always tell you which type of object the set is holding\n\ - and will correspond with the object's endpoint on the API\n\n _set\n\ - \nSo a set called 'net_set' will hold Network objects (api endpoint /net)\n\ - \n### Depth\n\nNested sets will not be loaded (any field ending with the _set\ - \ suffix) unless the 'depth'\nparameter is passed in the request URL.\n\n\ - Depth can be one of three values:\n\n - 1 : expand sets into ids (slow)\n\ - \ - 2 : expand sets into objects (slower)\n - 0 : dont expand sets at all\ + \n### Nested data\n\nAny field ending in the suffix **_set** (with the exception\ + \ of 'irr_as_set') is a list of objects in a relationship with the parent\n\ + object, you can expand those lists with the 'depth' parameter as explained\ + \ below.\n\nThe naming schema of the field will always tell you which type\ + \ of object the set is holding\nand will correspond with the object's endpoint\ + \ on the API\n\n _set\n\nSo a set called 'net_set' will hold\ + \ Network objects (api endpoint /net)\n\n### Depth\n\nNested sets will not\ + \ be loaded (any field ending with the _set suffix, with the exception of\ + \ 'irr_as_set') unless the 'depth'\nparameter is passed in the request URL.\n\ + \nDepth can be one of three values:\n\n - 1 : expand sets into ids (slow)\n\ + \ - 2 : expand sets into objects (slower)\n - 0 : don't expand sets at all\ \ (default behaviour)\n\n**example**\n\n ?depth=1\n\n### Cached Responses\n\ \nAny request that does not require lookups will be served a cached result.\ \ Cache is updated approximately every 15 minutes.\n\nYou can spot cached\ @@ -11801,6 +8633,15 @@ paths: required: false schema: type: integer + - name: ix__aka + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string - name: ix__city in: query description: 'Filter results by matching a value against this field. @@ -11851,6 +8692,18 @@ paths: required: false schema: type: date-time + - name: ix__fac_count + in: query + description: 'number of facilities at this exchange + + + Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: integer - name: ix__id in: query description: 'Filter results by matching a value against this field. @@ -11860,6 +8713,33 @@ paths: required: false schema: type: integer + - name: ix__ixf_import_request + in: query + description: 'Date of most recent manual import request + + + Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: date-time + - name: ix__ixf_import_request_status + in: query + description: 'The current status of the manual ix-f import request + + + Filter results by matching a value against this field. + + + `queued`, `importing`, `finished`, `error` + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string - name: ix__ixf_last_import in: query description: 'Filter results by matching a value against this field. @@ -11908,6 +8788,18 @@ paths: required: false schema: type: string + - name: ix__net_count + in: query + description: 'number of networks at this exchange + + + Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: integer - name: ix__notes in: query description: 'Filter results by matching a value against this field. @@ -11928,7 +8820,12 @@ paths: type: string - name: ix__policy_phone in: query - description: 'Filter results by matching a value against this field. + description: 'An E.164-formatted phone number starts with a +, followed by + the country code, then the national phone number (dropping the leading 0 + in most countries), without spaces or dashes between the groups of digits + + + Filter results by matching a value against this field. Supported filter suffixes: `__startswith`, `__contains`, `__in`' @@ -11962,6 +8859,42 @@ paths: `Middle East` + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: ix__sales_email + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: ix__sales_phone + in: query + description: 'An E.164-formatted phone number starts with a +, followed by + the country code, then the national phone number (dropping the leading 0 + in most countries), without spaces or dashes between the groups of digits + + + Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: ix__service_level + in: query + description: 'Filter results by matching a value against this field. + + + ``, `Not Disclosed`, `Best Effort (no SLA)`, `Normal Business Hours`, `24/7 + Support` + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' required: false schema: @@ -11985,10 +8918,28 @@ paths: schema: type: string - name: ix__tech_phone + in: query + description: 'An E.164-formatted phone number starts with a +, followed by + the country code, then the national phone number (dropping the leading 0 + in most countries), without spaces or dashes between the groups of digits + + + Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: ix__terms in: query description: 'Filter results by matching a value against this field. + ``, `Not Disclosed`, `No Commercial Terms`, `Bundled With Other Services`, + `Non-recurring Fees Only`, `Recurring Fees` + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' required: false schema: @@ -12059,6 +9010,19 @@ paths: required: false schema: type: date-time + - name: ixf_ixp_import_protocol_conflict + in: query + description: 'IX has been sending IP addresses for protocol not supported + by network + + + Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: integer - name: ixf_ixp_member_list_url in: query description: 'Filter results by matching a value against this field. @@ -12171,438 +9135,10 @@ paths: schema: type: array items: - properties: - id: - type: integer - readOnly: true - ix_id: - type: integer - ix: - type: string - readOnly: true - name: - type: string - maxLength: 255 - descr: - type: string - mtu: - type: integer - maximum: 4294967295 - format: int64 - nullable: true - minimum: 0 - dot1q_support: - type: boolean - rs_asn: - type: integer - maximum: 4294967295 - format: int64 - nullable: true - minimum: 0 - arp_sponge: - type: string - nullable: true - pattern: (?i)^([0-9a-f]{2}[-:]){5}[0-9a-f]{2}$ - net_set: - type: array - items: - properties: - id: - type: integer - readOnly: true - org_id: - type: integer - org: - type: string - readOnly: true - name: - type: string - maxLength: 255 - aka: - type: string - maxLength: 255 - website: - type: string - format: uri - maxLength: 255 - pattern: "^(?:[a-z0-9\\.\\-\\+]*)://(?:[^\\s:@/]+(?::[^\\\ - s:@/]*)?@)?(?:(?:25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(?:\\\ - .(?:25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}|\\[[0-9a-f:\\\ - .]+\\]|([a-z\xA1-\uFFFF0-9](?:[a-z\xA1-\uFFFF0-9-]{0,61}[a-z\xA1\ - -\uFFFF0-9])?(?:\\.(?!-)[a-z\xA1-\uFFFF0-9-]{1,63}(?_set\n\ - \nSo a set called 'net_set' will hold Network objects (api endpoint /net)\n\ - \n### Depth\n\nNested sets will not be loaded (any field ending with the _set\ - \ suffix) unless the 'depth'\nparameter is passed in the request URL.\n\n\ - Depth can be one of three values:\n\n - 1 : expand sets into ids (slow)\n\ - \ - 2 : expand sets into objects (slower)\n - 0 : dont expand sets at all\ + \n### Nested data\n\nAny field ending in the suffix **_set** (with the exception\ + \ of 'irr_as_set') is a list of objects in a relationship with the parent\n\ + object, you can expand those lists with the 'depth' parameter as explained\ + \ below.\n\nThe naming schema of the field will always tell you which type\ + \ of object the set is holding\nand will correspond with the object's endpoint\ + \ on the API\n\n _set\n\nSo a set called 'net_set' will hold\ + \ Network objects (api endpoint /net)\n\n### Depth\n\nNested sets will not\ + \ be loaded (any field ending with the _set suffix, with the exception of\ + \ 'irr_as_set') unless the 'depth'\nparameter is passed in the request URL.\n\ + \nDepth can be one of three values:\n\n - 1 : expand sets into ids (slow)\n\ + \ - 2 : expand sets into objects (slower)\n - 0 : don't expand sets at all\ \ (default behaviour)\n\n**example**\n\n ?depth=1\n\n### Cached Responses\n\ \nAny request that does not require lookups will be served a cached result.\ \ Cache is updated approximately every 15 minutes.\n\nYou can spot cached\ @@ -13772,6 +9886,19 @@ paths: required: false schema: type: date-time + - name: ixlan__ixf_ixp_import_protocol_conflict + in: query + description: 'IX has been sending IP addresses for protocol not supported + by network + + + Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: integer - name: ixlan__ixf_ixp_member_list_url_visible in: query description: 'Filter results by matching a value against this field. @@ -13941,70 +10068,110 @@ paths: schema: type: array items: - properties: - id: - type: integer - readOnly: true - ixlan: - type: string - readOnly: true - ixlan_id: - type: string - protocol: - enum: - - IPv4 - - IPv6 - prefix: - type: string - in_dfz: - type: boolean - created: - type: string - format: date-time - readOnly: true - updated: - type: string - format: date-time - readOnly: true - status: - type: string - maxLength: 255 - required: - - ixlan_id - - protocol - - prefix + $ref: '#/components/schemas/IXLanPrefix' description: '' + tags: + - api post: operationId: create ixpfx - description: "Creates a new `ixpfx` type object.\n\n## Internet Exchange Prefix\ - \ \n\nIdentified by the `ixpfx` tag.\n\n### Parent relationship:\n\n- `ix`\ - \ internet exchange\n\n### Relationship(s):\n\n- None\n\n\n## Creating objects\n\ - \n### Status `pending`\n\nSome object types will be flagged as `pending` until\ - \ they have been reviewed and approved by peeringdb staff.\n\nCurrently this\ - \ is the case for:\n\n\n- `org` organizations (only administrative staff users\ - \ are currently allowed to create organizations)\n- `fac` facilities\n- `net`\ - \ networks\n- `ix` exchanges\n- `ixpfx` prefixes (if part of a new exchange)\n\ - - `ixlan` exchange networks (if part of a new exchange)\n\n### Permissions\n\ - \nTo be able to create an object, the requesting user requires `create` permissions\ - \ to one of the\nobject's parents in the relationship hierarchy.\n\nFor example\ - \ to create a `net` type object, the user needs to be permissioned to create\ - \ in the organzation\nthat is to be the network's holder entity.\n" + description: 'Creates a new `ixpfx` type object. + + + ## Internet Exchange Prefix + + + Identified by the `ixpfx` tag. + + + ### Parent relationship: + + + - `ix` internet exchange + + + ### Relationship(s): + + + - None + + + + ## Creating objects + + + ### Status `pending` + + + Some object types will be flagged as `pending` until they have been reviewed + and approved by peeringdb staff. + + + Currently this is the case for: + + + + - `org` organizations (only administrative staff users are currently allowed + to create organizations) + + - `fac` facilities + + - `net` networks + + - `ix` exchanges + + - `ixpfx` prefixes (if part of a new exchange) + + - `ixlan` exchange networks (if part of a new exchange) + + + ### Permissions + + + To be able to create an object, the requesting user requires `create` permissions + to one of the + + object''s parents in the relationship hierarchy. + + + For example to create a `net` type object, the user needs to be permissioned + to create in the organization + + that is to be the network''s holder entity. + + ' parameters: [] requestBody: content: application/json: - schema: &id011 + schema: + type: object properties: + id: + type: integer + readOnly: true + ixlan: + type: string + readOnly: true ixlan_id: type: string protocol: enum: - IPv4 - IPv6 + type: string prefix: type: string in_dfz: - type: boolean + type: string + readOnly: true + created: + type: string + format: date-time + readOnly: true + updated: + type: string + format: date-time + readOnly: true status: type: string maxLength: 255 @@ -14013,59 +10180,32 @@ paths: - protocol - prefix application/x-www-form-urlencoded: - schema: *id011 + schema: + $ref: '#/components/schemas/IXLanPrefix' multipart/form-data: - schema: *id011 + schema: + $ref: '#/components/schemas/IXLanPrefix' responses: - '200': + '201': content: application/json: schema: - properties: - id: - type: integer - readOnly: true - ixlan: - type: string - readOnly: true - ixlan_id: - type: string - protocol: - enum: - - IPv4 - - IPv6 - prefix: - type: string - in_dfz: - type: boolean - created: - type: string - format: date-time - readOnly: true - updated: - type: string - format: date-time - readOnly: true - status: - type: string - maxLength: 255 - required: - - ixlan_id - - protocol - - prefix + $ref: '#/components/schemas/IXLanPrefix' description: '' + tags: + - api /api/ixpfx/{id}: get: operationId: retrieve ixpfx description: "Retrieves a single `ixpfx` type object by id\n\n## Internet Exchange\ - \ Prefix \n\nIdentified by the `ixpfx` tag.\n\n### Parent relationship:\n\n\ + \ Prefix\n\nIdentified by the `ixpfx` tag.\n\n### Parent relationship:\n\n\ - `ix` internet exchange\n\n### Relationship(s):\n\n- None\n\n\n## Retrieve\ \ a single object\n\n### Depth\n\nNested sets will not be expanded (any field\ - \ ending with the _set suffix) unless the 'depth'\nparameter is passed in\ - \ the request URL.\n\nDepth can be one of three values:\n\n - 1 : expand\ - \ sets into ids (slow)\n - 2 : expand sets into objects (slower)\n - 0 :\ - \ dont expand sets at all (default behaviour)\n\n**example**\n\n ?depth=1\n\ - \n\n" + \ ending with the _set suffix, with the exception of 'irr_as_set') unless\ + \ the 'depth'\nparameter is passed in the request URL.\n\nDepth can be one\ + \ of three values:\n\n - 1 : expand sets into ids (slow)\n - 2 : expand\ + \ sets into objects (slower)\n - 0 : don't expand sets at all (default behaviour)\n\ + \n**example**\n\n ?depth=1\n" parameters: - name: id in: path @@ -14087,47 +10227,44 @@ paths: content: application/json: schema: - properties: - id: - type: integer - readOnly: true - ixlan: - type: string - readOnly: true - ixlan_id: - type: string - protocol: - enum: - - IPv4 - - IPv6 - prefix: - type: string - in_dfz: - type: boolean - created: - type: string - format: date-time - readOnly: true - updated: - type: string - format: date-time - readOnly: true - status: - type: string - maxLength: 255 - required: - - ixlan_id - - protocol - - prefix + $ref: '#/components/schemas/IXLanPrefix' description: '' + tags: + - api put: operationId: update ixpfx - description: "Updates an existing `ixpfx` type object.\n\n## Internet Exchange\ - \ Prefix \n\nIdentified by the `ixpfx` tag.\n\n### Parent relationship:\n\n\ - - `ix` internet exchange\n\n### Relationship(s):\n\n- None\n\n\n## Update\ - \ existing objects\n\n### Permissions\n\nIn order to update an object the\ - \ requesting user requires `update` permissions to the object itself or one\ - \ of the parent relationships in the object hierarchy\n" + description: 'Updates an existing `ixpfx` type object. + + + ## Internet Exchange Prefix + + + Identified by the `ixpfx` tag. + + + ### Parent relationship: + + + - `ix` internet exchange + + + ### Relationship(s): + + + - None + + + + ## Update existing objects + + + ### Permissions + + + In order to update an object the requesting user requires `update` permissions + to the object itself or one of the parent relationships in the object hierarchy + + ' parameters: - name: id in: path @@ -14138,18 +10275,35 @@ paths: requestBody: content: application/json: - schema: &id012 + schema: + type: object properties: + id: + type: integer + readOnly: true + ixlan: + type: string + readOnly: true ixlan_id: type: string protocol: enum: - IPv4 - IPv6 + type: string prefix: type: string in_dfz: - type: boolean + type: string + readOnly: true + created: + type: string + format: date-time + readOnly: true + updated: + type: string + format: date-time + readOnly: true status: type: string maxLength: 255 @@ -14158,52 +10312,43 @@ paths: - protocol - prefix application/x-www-form-urlencoded: - schema: *id012 + schema: + $ref: '#/components/schemas/IXLanPrefix' multipart/form-data: - schema: *id012 + schema: + $ref: '#/components/schemas/IXLanPrefix' responses: '200': content: application/json: schema: - properties: - id: - type: integer - readOnly: true - ixlan: - type: string - readOnly: true - ixlan_id: - type: string - protocol: - enum: - - IPv4 - - IPv6 - prefix: - type: string - in_dfz: - type: boolean - created: - type: string - format: date-time - readOnly: true - updated: - type: string - format: date-time - readOnly: true - status: - type: string - maxLength: 255 - required: - - ixlan_id - - protocol - - prefix + $ref: '#/components/schemas/IXLanPrefix' description: '' + tags: + - api patch: operationId: patch ixpfx - description: "PATCH (partial update) is currently disabled\n\n## Internet Exchange\ - \ Prefix \n\nIdentified by the `ixpfx` tag.\n\n### Parent relationship:\n\n\ - - `ix` internet exchange\n\n### Relationship(s):\n\n- None\n" + description: 'PATCH (partial update) is currently disabled. + + + ## Internet Exchange Prefix + + + Identified by the `ixpfx` tag. + + + ### Parent relationship: + + + - `ix` internet exchange + + + ### Relationship(s): + + + - None + + ' parameters: - name: id in: path @@ -14214,69 +10359,84 @@ paths: requestBody: content: application/json: - schema: &id013 + schema: + type: object properties: + id: + type: integer + readOnly: true + ixlan: + type: string + readOnly: true ixlan_id: type: string protocol: enum: - IPv4 - IPv6 + type: string prefix: type: string in_dfz: - type: boolean + type: string + readOnly: true + created: + type: string + format: date-time + readOnly: true + updated: + type: string + format: date-time + readOnly: true status: type: string maxLength: 255 + required: + - ixlan_id + - protocol + - prefix application/x-www-form-urlencoded: - schema: *id013 + schema: + $ref: '#/components/schemas/IXLanPrefix' multipart/form-data: - schema: *id013 + schema: + $ref: '#/components/schemas/IXLanPrefix' responses: '200': content: application/json: schema: - properties: - id: - type: integer - readOnly: true - ixlan: - type: string - readOnly: true - ixlan_id: - type: string - protocol: - enum: - - IPv4 - - IPv6 - prefix: - type: string - in_dfz: - type: boolean - created: - type: string - format: date-time - readOnly: true - updated: - type: string - format: date-time - readOnly: true - status: - type: string - maxLength: 255 - required: - - ixlan_id - - protocol - - prefix + $ref: '#/components/schemas/IXLanPrefix' description: '' + tags: + - api delete: operationId: delete ixpfx - description: "Marks an `ixpfx` type object as `deleted`.\n\n## Internet Exchange\ - \ Prefix \n\nIdentified by the `ixpfx` tag.\n\n### Parent relationship:\n\n\ - - `ix` internet exchange\n\n### Relationship(s):\n\n- None\n\n\n## Deleting\ - \ objects\n" + description: 'Marks an `ixpfx` type object as `deleted`. + + + ## Internet Exchange Prefix + + + Identified by the `ixpfx` tag. + + + ### Parent relationship: + + + - `ix` internet exchange + + + ### Relationship(s): + + + - None + + + + ## Deleting objects + + ' parameters: - name: id in: path @@ -14287,6 +10447,8 @@ paths: responses: '204': description: '' + tags: + - api /api/net: get: operationId: list net @@ -14310,16 +10472,17 @@ paths: \ all\nobjects updated since then. Note that this result will contain objects\ \ that were\ndeleted in that timeframe as well - you can spot them by checking\ \ for status \"deleted\"\n\n**example**\n\n ?since=1443414678\n\n### Nested\ - \ data\n\nAny field ending in the suffix **_set** is a list of objects in\ - \ a relationship with the parent\nobject, you can expand those lists with\ - \ the 'depth' parameter as explained below.\n\nThe naming schema of the field\ - \ will always tell you which type of object the set is holding\nand will correspond\ - \ with the object's endpoint on the API\n\n _set\n\nSo a set\ - \ called 'net_set' will hold Network objects (api endpoint /net)\n\n### Depth\n\ - \nNested sets will not be loaded (any field ending with the _set suffix) unless\ + \ data\n\nAny field ending in the suffix **_set** (with the exception of 'irr_as_set')\ + \ is a list of objects in a relationship with the parent\nobject, you can\ + \ expand those lists with the 'depth' parameter as explained below.\n\nThe\ + \ naming schema of the field will always tell you which type of object the\ + \ set is holding\nand will correspond with the object's endpoint on the API\n\ + \n _set\n\nSo a set called 'net_set' will hold Network objects\ + \ (api endpoint /net)\n\n### Depth\n\nNested sets will not be loaded (any\ + \ field ending with the _set suffix, with the exception of 'irr_as_set') unless\ \ the 'depth'\nparameter is passed in the request URL.\n\nDepth can be one\ \ of three values:\n\n - 1 : expand sets into ids (slow)\n - 2 : expand\ - \ sets into objects (slower)\n - 0 : dont expand sets at all (default behaviour)\n\ + \ sets into objects (slower)\n - 0 : don't expand sets at all (default behaviour)\n\ \n**example**\n\n ?depth=1\n\n### Cached Responses\n\nAny request that\ \ does not require lookups will be served a cached result. Cache is updated\ \ approximately every 15 minutes.\n\nYou can spot cached responses by checking\ @@ -14351,7 +10514,7 @@ paths: type: string - name: allow_ixp_update in: query - description: 'Sepcifies whether an ixp is allowed to add a netixlan entry + description: 'Specifies whether an IXP is allowed to add a netixlan entry for this network via their ixp_member data @@ -14395,6 +10558,18 @@ paths: required: false schema: type: number + - name: fac_count + in: query + description: 'number of facilities at this network + + + Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: integer - name: id in: query description: 'Filter results by matching a value against this field. @@ -14428,8 +10603,8 @@ paths: type: integer - name: info_prefixes4 in: query - description: 'Recommended IPv4 maximum-prefix limit to be configured on peering - sessions for this ASN + description: 'Recommended maximum number of IPv4 routes/prefixes to be configured + on peering sessions for this ASN Filter results by matching a value against this field. @@ -14441,8 +10616,8 @@ paths: type: integer - name: info_prefixes6 in: query - description: 'Recommended IPv6 maximum-prefix limit to be configured on peering - sessions for this ASN + description: 'Recommended maximum number of IPv6 routes/prefixes to be configured + on peering sessions for this ASN Filter results by matching a value against this field. @@ -14499,7 +10674,7 @@ paths: ``, `Not Disclosed`, `NSP`, `Content`, `Cable/DSL/ISP`, `Enterprise`, `Educational/Research`, - `Non-Profit`, `Route Server` + `Non-Profit`, `Route Server`, `Network Services`, `Route Collector`, `Government` Supported filter suffixes: `__startswith`, `__contains`, `__in`' @@ -14534,6 +10709,18 @@ paths: required: false schema: type: number + - name: ix_count + in: query + description: 'number of exchanges at this network + + + Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: integer - name: ixlan in: query description: 'Find networks connected at ixlan (ixlan id) @@ -14564,6 +10751,15 @@ paths: description: 'Filter results by matching a value against this field. + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: name_long + in: query + description: 'Filter results by matching a value against this field. + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' required: false schema: @@ -14586,6 +10782,15 @@ paths: required: false schema: type: number + - name: netfac_updated + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: date-time - name: netixlan in: query description: 'Find the network that contains this netixlan (netixlan id) @@ -14595,6 +10800,15 @@ paths: required: false schema: type: number + - name: netixlan_updated + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: date-time - name: not_fac in: query description: 'Find networks not present at a facility (facility id) @@ -14654,6 +10868,15 @@ paths: description: 'Filter results by matching a value against this field. + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: org__aka + in: query + description: 'Filter results by matching a value against this field. + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' required: false schema: @@ -14708,6 +10931,58 @@ paths: required: false schema: type: date-time + - name: org__flagged + in: query + description: 'Flag the organization for deletion + + + Filter results by matching a value against this field.' + required: false + schema: + type: integer + - name: org__flagged_date + in: query + description: 'Date when the organization was flagged + + + Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: date-time + - name: org__floor + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: org__geocode_date + in: query + description: 'Last time of attempted geocode + + + Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: date-time + - name: org__geocode_status + in: query + description: 'Has this object''s address been normalized with a call to the + Google Maps API + + + Filter results by matching a value against this field.' + required: false + schema: + type: integer - name: org__id in: query description: 'Filter results by matching a value against this field. @@ -14722,6 +10997,15 @@ paths: description: 'Filter results by matching a value against this field. + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: org__name_long + in: query + description: 'Filter results by matching a value against this field. + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' required: false schema: @@ -14749,6 +11033,15 @@ paths: description: 'Filter results by matching a value against this field. + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: org__suite + in: query + description: 'Filter results by matching a value against this field. + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' required: false schema: @@ -14789,6 +11082,15 @@ paths: required: false schema: type: string + - name: poc_updated + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: date-time - name: policy_contracts in: query description: 'Filter results by matching a value against this field. @@ -14907,329 +11209,10 @@ paths: schema: type: array items: - properties: - id: - type: integer - readOnly: true - org_id: - type: integer - org: - type: string - readOnly: true - name: - type: string - maxLength: 255 - aka: - type: string - maxLength: 255 - website: - type: string - format: uri - maxLength: 255 - pattern: "^(?:[a-z0-9\\.\\-\\+]*)://(?:[^\\s:@/]+(?::[^\\s:@/]*)?@)?(?:(?:25[0-5]|2[0-4]\\\ - d|[0-1]?\\d?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}|\\\ - [[0-9a-f:\\.]+\\]|([a-z\xA1-\uFFFF0-9](?:[a-z\xA1-\uFFFF0-9-]{0,61}[a-z\xA1\ - -\uFFFF0-9])?(?:\\.(?!-)[a-z\xA1-\uFFFF0-9-]{1,63}(?_set\n\ - \nSo a set called 'net_set' will hold Network objects (api endpoint /net)\n\ - \n### Depth\n\nNested sets will not be loaded (any field ending with the _set\ - \ suffix) unless the 'depth'\nparameter is passed in the request URL.\n\n\ - Depth can be one of three values:\n\n - 1 : expand sets into ids (slow)\n\ - \ - 2 : expand sets into objects (slower)\n - 0 : dont expand sets at all\ + \n### Nested data\n\nAny field ending in the suffix **_set** (with the exception\ + \ of 'irr_as_set') is a list of objects in a relationship with the parent\n\ + object, you can expand those lists with the 'depth' parameter as explained\ + \ below.\n\nThe naming schema of the field will always tell you which type\ + \ of object the set is holding\nand will correspond with the object's endpoint\ + \ on the API\n\n _set\n\nSo a set called 'net_set' will hold\ + \ Network objects (api endpoint /net)\n\n### Depth\n\nNested sets will not\ + \ be loaded (any field ending with the _set suffix, with the exception of\ + \ 'irr_as_set') unless the 'depth'\nparameter is passed in the request URL.\n\ + \nDepth can be one of three values:\n\n - 1 : expand sets into ids (slow)\n\ + \ - 2 : expand sets into objects (slower)\n - 0 : don't expand sets at all\ \ (default behaviour)\n\n**example**\n\n ?depth=1\n\n### Cached Responses\n\ \nAny request that does not require lookups will be served a cached result.\ \ Cache is updated approximately every 15 minutes.\n\nYou can spot cached\ @@ -17380,7 +12739,7 @@ paths: type: string - name: net__allow_ixp_update in: query - description: 'Sepcifies whether an ixp is allowed to add a netixlan entry + description: 'Specifies whether an IXP is allowed to add a netixlan entry for this network via their ixp_member data @@ -17406,6 +12765,18 @@ paths: required: false schema: type: date-time + - name: net__fac_count + in: query + description: 'number of facilities at this network + + + Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: integer - name: net__id in: query description: 'Filter results by matching a value against this field. @@ -17439,8 +12810,8 @@ paths: type: integer - name: net__info_prefixes4 in: query - description: 'Recommended IPv4 maximum-prefix limit to be configured on peering - sessions for this ASN + description: 'Recommended maximum number of IPv4 routes/prefixes to be configured + on peering sessions for this ASN Filter results by matching a value against this field. @@ -17452,8 +12823,8 @@ paths: type: integer - name: net__info_prefixes6 in: query - description: 'Recommended IPv6 maximum-prefix limit to be configured on peering - sessions for this ASN + description: 'Recommended maximum number of IPv6 routes/prefixes to be configured + on peering sessions for this ASN Filter results by matching a value against this field. @@ -17510,7 +12881,7 @@ paths: ``, `Not Disclosed`, `NSP`, `Content`, `Cable/DSL/ISP`, `Enterprise`, `Educational/Research`, - `Non-Profit`, `Route Server` + `Non-Profit`, `Route Server`, `Network Services`, `Route Collector`, `Government` Supported filter suffixes: `__startswith`, `__contains`, `__in`' @@ -17536,6 +12907,18 @@ paths: required: false schema: type: string + - name: net__ix_count + in: query + description: 'number of exchanges at this network + + + Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: integer - name: net__looking_glass in: query description: 'Filter results by matching a value against this field. @@ -17554,6 +12937,33 @@ paths: required: false schema: type: string + - name: net__name_long + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: net__netfac_updated + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: date-time + - name: net__netixlan_updated + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: date-time - name: net__notes in: query description: 'Filter results by matching a value against this field. @@ -17563,6 +12973,15 @@ paths: required: false schema: type: string + - name: net__poc_updated + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: date-time - name: net__policy_contracts in: query description: 'Filter results by matching a value against this field. @@ -17671,7 +13090,12 @@ paths: type: integer - name: phone in: query - description: 'Filter results by matching a value against this field. + description: 'An E.164-formatted phone number starts with a +, followed by + the country code, then the national phone number (dropping the leading 0 + in most countries), without spaces or dashes between the groups of digits + + + Filter results by matching a value against this field. Supported filter suffixes: `__startswith`, `__contains`, `__in`' @@ -17760,87 +13184,92 @@ paths: schema: type: array items: - properties: - id: - type: integer - readOnly: true - net_id: - type: integer - net: - type: string - readOnly: true - role: - enum: - - Abuse - - Maintenance - - Policy - - Technical - - NOC - - Public Relations - - Sales - visible: - enum: - - Private - - Users - - Public - name: - type: string - maxLength: 254 - phone: - type: string - maxLength: 100 - email: - type: string - format: email - maxLength: 254 - url: - type: string - format: uri - maxLength: 255 - pattern: "^(?:[a-z0-9\\.\\-\\+]*)://(?:[^\\s:@/]+(?::[^\\s:@/]*)?@)?(?:(?:25[0-5]|2[0-4]\\\ - d|[0-1]?\\d?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}|\\\ - [[0-9a-f:\\.]+\\]|([a-z\xA1-\uFFFF0-9](?:[a-z\xA1-\uFFFF0-9-]{0,61}[a-z\xA1\ - -\uFFFF0-9])?(?:\\.(?!-)[a-z\xA1-\uFFFF0-9-]{1,63}(?_set\n\ - \nSo a set called 'net_set' will hold Network objects (api endpoint /net)\n\ - \n### Depth\n\nNested sets will not be loaded (any field ending with the _set\ - \ suffix) unless the 'depth'\nparameter is passed in the request URL.\n\n\ - Depth can be one of three values:\n\n - 1 : expand sets into ids (slow)\n\ - \ - 2 : expand sets into objects (slower)\n - 0 : dont expand sets at all\ + \n### Nested data\n\nAny field ending in the suffix **_set** (with the exception\ + \ of 'irr_as_set') is a list of objects in a relationship with the parent\n\ + object, you can expand those lists with the 'depth' parameter as explained\ + \ below.\n\nThe naming schema of the field will always tell you which type\ + \ of object the set is holding\nand will correspond with the object's endpoint\ + \ on the API\n\n _set\n\nSo a set called 'net_set' will hold\ + \ Network objects (api endpoint /net)\n\n### Depth\n\nNested sets will not\ + \ be loaded (any field ending with the _set suffix, with the exception of\ + \ 'irr_as_set') unless the 'depth'\nparameter is passed in the request URL.\n\ + \nDepth can be one of three values:\n\n - 1 : expand sets into ids (slow)\n\ + \ - 2 : expand sets into objects (slower)\n - 0 : don't expand sets at all\ \ (default behaviour)\n\n**example**\n\n ?depth=1\n\n### Cached Responses\n\ \nAny request that does not require lookups will be served a cached result.\ \ Cache is updated approximately every 15 minutes.\n\nYou can spot cached\ @@ -18430,6 +13778,31 @@ paths: description: 'Filter results by matching a value against this field. + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: fac__aka + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: fac__available_voltage_services + in: query + description: 'The alternating current voltage available to users of the facility + either directly from the landlord or delivered by the utility separately. + + + Filter results by matching a value against this field. + + + `48 VDC`, `120 VAC`, `208 VAC`, `240 VAC`, `480 VAC` + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' required: false schema: @@ -18493,6 +13866,25 @@ paths: required: false schema: type: date-time + - name: fac__diverse_serving_substations + in: query + description: 'Two separate and distinct paths to individual substations which + should maintain a separated path back to one or more utility generator stations. + + + Filter results by matching a value against this field.' + required: false + schema: + type: integer + - name: fac__floor + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string - name: fac__geocode_date in: query description: 'Last time of attempted geocode @@ -18505,22 +13897,10 @@ paths: required: false schema: type: date-time - - name: fac__geocode_error - in: query - description: 'Error message of previous geocode attempt - - - Filter results by matching a value against this field. - - - Supported filter suffixes: `__startswith`, `__contains`, `__in`' - required: false - schema: - type: string - name: fac__geocode_status in: query - description: 'Has this object''s latitude and longitude been syncronized to - it''s address fields + description: 'Has this object''s address been normalized with a call to the + Google Maps API Filter results by matching a value against this field.' @@ -18532,6 +13912,18 @@ paths: description: 'Filter results by matching a value against this field. + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: integer + - name: fac__ix_count + in: query + description: 'number of exchanges at this facility + + + Filter results by matching a value against this field. + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' required: false schema: @@ -18563,6 +13955,27 @@ paths: required: false schema: type: string + - name: fac__name_long + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: fac__net_count + in: query + description: 'number of networks at this facility + + + Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: integer - name: fac__notes in: query description: 'Filter results by matching a value against this field. @@ -18577,6 +13990,36 @@ paths: description: 'Filter results by matching a value against this field. + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: fac__property + in: query + description: 'A property owner is the individual or entity that has title + to the property. A lessee is a user of a property who has a lease, an agreement, + with the owner of the property. + + + Filter results by matching a value against this field. + + + ``, `Owner`, `Lessee` + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: fac__region_continent + in: query + description: 'Filter results by matching a value against this field. + + + `North America`, `Asia Pacific`, `Europe`, `South America`, `Africa`, `Australia`, + `Middle East` + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' required: false schema: @@ -18601,7 +14044,12 @@ paths: type: string - name: fac__sales_phone in: query - description: 'Filter results by matching a value against this field. + description: 'An E.164-formatted phone number starts with a +, followed by + the country code, then the national phone number (dropping the leading 0 + in most countries), without spaces or dashes between the groups of digits + + + Filter results by matching a value against this field. Supported filter suffixes: `__startswith`, `__contains`, `__in`' @@ -18622,6 +14070,15 @@ paths: description: 'Filter results by matching a value against this field. + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: fac__suite + in: query + description: 'Filter results by matching a value against this field. + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' required: false schema: @@ -18637,7 +14094,12 @@ paths: type: string - name: fac__tech_phone in: query - description: 'Filter results by matching a value against this field. + description: 'An E.164-formatted phone number starts with a +, followed by + the country code, then the national phone number (dropping the leading 0 + in most countries), without spaces or dashes between the groups of digits + + + Filter results by matching a value against this field. Supported filter suffixes: `__startswith`, `__contains`, `__in`' @@ -18737,7 +14199,7 @@ paths: type: string - name: net__allow_ixp_update in: query - description: 'Sepcifies whether an ixp is allowed to add a netixlan entry + description: 'Specifies whether an IXP is allowed to add a netixlan entry for this network via their ixp_member data @@ -18763,6 +14225,18 @@ paths: required: false schema: type: date-time + - name: net__fac_count + in: query + description: 'number of facilities at this network + + + Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: integer - name: net__id in: query description: 'Filter results by matching a value against this field. @@ -18796,8 +14270,8 @@ paths: type: integer - name: net__info_prefixes4 in: query - description: 'Recommended IPv4 maximum-prefix limit to be configured on peering - sessions for this ASN + description: 'Recommended maximum number of IPv4 routes/prefixes to be configured + on peering sessions for this ASN Filter results by matching a value against this field. @@ -18809,8 +14283,8 @@ paths: type: integer - name: net__info_prefixes6 in: query - description: 'Recommended IPv6 maximum-prefix limit to be configured on peering - sessions for this ASN + description: 'Recommended maximum number of IPv6 routes/prefixes to be configured + on peering sessions for this ASN Filter results by matching a value against this field. @@ -18867,7 +14341,7 @@ paths: ``, `Not Disclosed`, `NSP`, `Content`, `Cable/DSL/ISP`, `Enterprise`, `Educational/Research`, - `Non-Profit`, `Route Server` + `Non-Profit`, `Route Server`, `Network Services`, `Route Collector`, `Government` Supported filter suffixes: `__startswith`, `__contains`, `__in`' @@ -18893,6 +14367,18 @@ paths: required: false schema: type: string + - name: net__ix_count + in: query + description: 'number of exchanges at this network + + + Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: integer - name: net__looking_glass in: query description: 'Filter results by matching a value against this field. @@ -18911,6 +14397,33 @@ paths: required: false schema: type: string + - name: net__name_long + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: net__netfac_updated + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: date-time + - name: net__netixlan_updated + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: date-time - name: net__notes in: query description: 'Filter results by matching a value against this field. @@ -18920,6 +14433,15 @@ paths: required: false schema: type: string + - name: net__poc_updated + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: date-time - name: net__policy_contracts in: query description: 'Filter results by matching a value against this field. @@ -19074,81 +14596,120 @@ paths: schema: type: array items: - properties: - id: - type: integer - readOnly: true - name: - type: string - readOnly: true - city: - type: string - readOnly: true - country: - type: string - readOnly: true - net_id: - type: integer - net: - type: string - readOnly: true - fac_id: - type: integer - fac: - type: string - readOnly: true - local_asn: - type: integer - maximum: 4294967295 - format: int64 - nullable: true - minimum: 0 - created: - type: string - format: date-time - readOnly: true - updated: - type: string - format: date-time - readOnly: true - status: - type: string - maxLength: 255 - required: - - net_id - - fac_id + $ref: '#/components/schemas/NetworkFacility' description: '' + tags: + - api post: operationId: create netfac - description: "Creates a new `netfac` type object.\n\n## Network / Facility presence\ - \ \n\nIdentified by the `netfac` tag.\n\n### Parent relationship:\n\n- `net`\ - \ network\n\n### Relationship(s):\n\n- `fac` facility\n\n\n## Creating objects\n\ - \n### Status `pending`\n\nSome object types will be flagged as `pending` until\ - \ they have been reviewed and approved by peeringdb staff.\n\nCurrently this\ - \ is the case for:\n\n\n- `org` organizations (only administrative staff users\ - \ are currently allowed to create organizations)\n- `fac` facilities\n- `net`\ - \ networks\n- `ix` exchanges\n- `ixpfx` prefixes (if part of a new exchange)\n\ - - `ixlan` exchange networks (if part of a new exchange)\n\n### Permissions\n\ - \nTo be able to create an object, the requesting user requires `create` permissions\ - \ to one of the\nobject's parents in the relationship hierarchy.\n\nFor example\ - \ to create a `net` type object, the user needs to be permissioned to create\ - \ in the organzation\nthat is to be the network's holder entity.\n" + description: 'Creates a new `netfac` type object. + + + ## Network / Facility presence + + + Identified by the `netfac` tag. + + + ### Parent relationship: + + + - `net` network + + + ### Relationship(s): + + + - `fac` facility + + + + ## Creating objects + + + ### Status `pending` + + + Some object types will be flagged as `pending` until they have been reviewed + and approved by peeringdb staff. + + + Currently this is the case for: + + + + - `org` organizations (only administrative staff users are currently allowed + to create organizations) + + - `fac` facilities + + - `net` networks + + - `ix` exchanges + + - `ixpfx` prefixes (if part of a new exchange) + + - `ixlan` exchange networks (if part of a new exchange) + + + ### Permissions + + + To be able to create an object, the requesting user requires `create` permissions + to one of the + + object''s parents in the relationship hierarchy. + + + For example to create a `net` type object, the user needs to be permissioned + to create in the organization + + that is to be the network''s holder entity. + + ' parameters: [] requestBody: content: application/json: - schema: &id020 + schema: + type: object properties: + id: + type: integer + readOnly: true + name: + type: string + readOnly: true + city: + type: string + readOnly: true + country: + type: string + readOnly: true net_id: type: integer + net: + type: string + readOnly: true fac_id: type: integer + fac: + type: string + readOnly: true local_asn: type: integer maximum: 4294967295 format: int64 nullable: true minimum: 0 + created: + type: string + format: date-time + readOnly: true + updated: + type: string + format: date-time + readOnly: true status: type: string maxLength: 255 @@ -19156,70 +14717,32 @@ paths: - net_id - fac_id application/x-www-form-urlencoded: - schema: *id020 + schema: + $ref: '#/components/schemas/NetworkFacility' multipart/form-data: - schema: *id020 + schema: + $ref: '#/components/schemas/NetworkFacility' responses: - '200': + '201': content: application/json: schema: - properties: - id: - type: integer - readOnly: true - name: - type: string - readOnly: true - city: - type: string - readOnly: true - country: - type: string - readOnly: true - net_id: - type: integer - net: - type: string - readOnly: true - fac_id: - type: integer - fac: - type: string - readOnly: true - local_asn: - type: integer - maximum: 4294967295 - format: int64 - nullable: true - minimum: 0 - created: - type: string - format: date-time - readOnly: true - updated: - type: string - format: date-time - readOnly: true - status: - type: string - maxLength: 255 - required: - - net_id - - fac_id + $ref: '#/components/schemas/NetworkFacility' description: '' + tags: + - api /api/netfac/{id}: get: operationId: retrieve netfac description: "Retrieves a single `netfac` type object by id\n\n## Network /\ - \ Facility presence \n\nIdentified by the `netfac` tag.\n\n### Parent relationship:\n\ + \ Facility presence\n\nIdentified by the `netfac` tag.\n\n### Parent relationship:\n\ \n- `net` network\n\n### Relationship(s):\n\n- `fac` facility\n\n\n## Retrieve\ \ a single object\n\n### Depth\n\nNested sets will not be expanded (any field\ - \ ending with the _set suffix) unless the 'depth'\nparameter is passed in\ - \ the request URL.\n\nDepth can be one of three values:\n\n - 1 : expand\ - \ sets into ids (slow)\n - 2 : expand sets into objects (slower)\n - 0 :\ - \ dont expand sets at all (default behaviour)\n\n**example**\n\n ?depth=1\n\ - \n\n" + \ ending with the _set suffix, with the exception of 'irr_as_set') unless\ + \ the 'depth'\nparameter is passed in the request URL.\n\nDepth can be one\ + \ of three values:\n\n - 1 : expand sets into ids (slow)\n - 2 : expand\ + \ sets into objects (slower)\n - 0 : don't expand sets at all (default behaviour)\n\ + \n**example**\n\n ?depth=1\n" parameters: - name: id in: path @@ -19241,58 +14764,44 @@ paths: content: application/json: schema: - properties: - id: - type: integer - readOnly: true - name: - type: string - readOnly: true - city: - type: string - readOnly: true - country: - type: string - readOnly: true - net_id: - type: integer - net: - type: string - readOnly: true - fac_id: - type: integer - fac: - type: string - readOnly: true - local_asn: - type: integer - maximum: 4294967295 - format: int64 - nullable: true - minimum: 0 - created: - type: string - format: date-time - readOnly: true - updated: - type: string - format: date-time - readOnly: true - status: - type: string - maxLength: 255 - required: - - net_id - - fac_id + $ref: '#/components/schemas/NetworkFacility' description: '' + tags: + - api put: operationId: update netfac - description: "Updates an existing `netfac` type object.\n\n## Network / Facility\ - \ presence \n\nIdentified by the `netfac` tag.\n\n### Parent relationship:\n\ - \n- `net` network\n\n### Relationship(s):\n\n- `fac` facility\n\n\n## Update\ - \ existing objects\n\n### Permissions\n\nIn order to update an object the\ - \ requesting user requires `update` permissions to the object itself or one\ - \ of the parent relationships in the object hierarchy\n" + description: 'Updates an existing `netfac` type object. + + + ## Network / Facility presence + + + Identified by the `netfac` tag. + + + ### Parent relationship: + + + - `net` network + + + ### Relationship(s): + + + - `fac` facility + + + + ## Update existing objects + + + ### Permissions + + + In order to update an object the requesting user requires `update` permissions + to the object itself or one of the parent relationships in the object hierarchy + + ' parameters: - name: id in: path @@ -19303,18 +14812,45 @@ paths: requestBody: content: application/json: - schema: &id021 + schema: + type: object properties: + id: + type: integer + readOnly: true + name: + type: string + readOnly: true + city: + type: string + readOnly: true + country: + type: string + readOnly: true net_id: type: integer + net: + type: string + readOnly: true fac_id: type: integer + fac: + type: string + readOnly: true local_asn: type: integer maximum: 4294967295 format: int64 nullable: true minimum: 0 + created: + type: string + format: date-time + readOnly: true + updated: + type: string + format: date-time + readOnly: true status: type: string maxLength: 255 @@ -19322,63 +14858,43 @@ paths: - net_id - fac_id application/x-www-form-urlencoded: - schema: *id021 + schema: + $ref: '#/components/schemas/NetworkFacility' multipart/form-data: - schema: *id021 + schema: + $ref: '#/components/schemas/NetworkFacility' responses: '200': content: application/json: schema: - properties: - id: - type: integer - readOnly: true - name: - type: string - readOnly: true - city: - type: string - readOnly: true - country: - type: string - readOnly: true - net_id: - type: integer - net: - type: string - readOnly: true - fac_id: - type: integer - fac: - type: string - readOnly: true - local_asn: - type: integer - maximum: 4294967295 - format: int64 - nullable: true - minimum: 0 - created: - type: string - format: date-time - readOnly: true - updated: - type: string - format: date-time - readOnly: true - status: - type: string - maxLength: 255 - required: - - net_id - - fac_id + $ref: '#/components/schemas/NetworkFacility' description: '' + tags: + - api patch: operationId: patch netfac - description: "PATCH (partial update) is currently disabled\n\n## Network / Facility\ - \ presence \n\nIdentified by the `netfac` tag.\n\n### Parent relationship:\n\ - \n- `net` network\n\n### Relationship(s):\n\n- `fac` facility\n" + description: 'PATCH (partial update) is currently disabled. + + + ## Network / Facility presence + + + Identified by the `netfac` tag. + + + ### Parent relationship: + + + - `net` network + + + ### Relationship(s): + + + - `fac` facility + + ' parameters: - name: id in: path @@ -19389,80 +14905,93 @@ paths: requestBody: content: application/json: - schema: &id022 + schema: + type: object properties: + id: + type: integer + readOnly: true + name: + type: string + readOnly: true + city: + type: string + readOnly: true + country: + type: string + readOnly: true net_id: type: integer + net: + type: string + readOnly: true fac_id: type: integer + fac: + type: string + readOnly: true local_asn: type: integer maximum: 4294967295 format: int64 nullable: true minimum: 0 + created: + type: string + format: date-time + readOnly: true + updated: + type: string + format: date-time + readOnly: true status: type: string maxLength: 255 + required: + - net_id + - fac_id application/x-www-form-urlencoded: - schema: *id022 + schema: + $ref: '#/components/schemas/NetworkFacility' multipart/form-data: - schema: *id022 + schema: + $ref: '#/components/schemas/NetworkFacility' responses: '200': content: application/json: schema: - properties: - id: - type: integer - readOnly: true - name: - type: string - readOnly: true - city: - type: string - readOnly: true - country: - type: string - readOnly: true - net_id: - type: integer - net: - type: string - readOnly: true - fac_id: - type: integer - fac: - type: string - readOnly: true - local_asn: - type: integer - maximum: 4294967295 - format: int64 - nullable: true - minimum: 0 - created: - type: string - format: date-time - readOnly: true - updated: - type: string - format: date-time - readOnly: true - status: - type: string - maxLength: 255 - required: - - net_id - - fac_id + $ref: '#/components/schemas/NetworkFacility' description: '' + tags: + - api delete: operationId: delete netfac - description: "Marks an `netfac` type object as `deleted`.\n\n## Network / Facility\ - \ presence \n\nIdentified by the `netfac` tag.\n\n### Parent relationship:\n\ - \n- `net` network\n\n### Relationship(s):\n\n- `fac` facility\n\n\n## Deleting\ - \ objects\n" + description: 'Marks an `netfac` type object as `deleted`. + + + ## Network / Facility presence + + + Identified by the `netfac` tag. + + + ### Parent relationship: + + + - `net` network + + + ### Relationship(s): + + + - `fac` facility + + + + ## Deleting objects + + ' parameters: - name: id in: path @@ -19473,57 +15002,60 @@ paths: responses: '204': description: '' + tags: + - api /api/netixlan: get: operationId: list netixlan description: "Retrieves a list of `netixlan` type objects\n\n## Network to Internet\ - \ Exchange connection \n\nIdentified by the `netixlan` tag.\n\n### Parent\ - \ relationship:\n\n- `net` network\n\n### Relationship(s):\n\n- `ixlan` internet\ - \ exchange network information\n\n\n## List objects\n\n### Querying\n\nYou\ - \ may query the resultset by passing field names as url parameters\n\n###\ - \ Numeric Queries\n\nOn numeric fields you can suffix the field names with\ - \ the following filters:\n\n- \\_\\_lt : less-than\n- \\_\\_lte : less-than-equal\n\ - - \\_\\_gt : greater-than\n- \\_\\_gte : greater-than-equal\n- \\_\\_in :\ - \ value inside set of values (comma separated)\n\n**examples**\n\n ?__lt=10\n\ - \ ?__in=1,10\n\n### String Queries\n\nOn string fields you\ - \ can suffix the field names with the following filters:\n\n- \\_\\_contains\ - \ : field value contains specified value\n- \\_\\_startswith : field value\ - \ starts with specified value\n- \\_\\_in : value contained inside set of\ - \ values (comma separated)\n\n**examples**\n\n ?__contains=something\n\ - \ ?__in=this,that\n\nAll string filtering operations are case-insensitive\n\ - \n### Since\n\n\nYou can use the since argument with a unix timestamp (seconds)\ - \ to retrieve all\nobjects updated since then. Note that this result will\ - \ contain objects that were\ndeleted in that timeframe as well - you can spot\ - \ them by checking for status \"deleted\"\n\n**example**\n\n ?since=1443414678\n\ - \n### Nested data\n\nAny field ending in the suffix **_set** is a list of\ - \ objects in a relationship with the parent\nobject, you can expand those\ - \ lists with the 'depth' parameter as explained below.\n\nThe naming schema\ - \ of the field will always tell you which type of object the set is holding\n\ - and will correspond with the object's endpoint on the API\n\n _set\n\ - \nSo a set called 'net_set' will hold Network objects (api endpoint /net)\n\ - \n### Depth\n\nNested sets will not be loaded (any field ending with the _set\ - \ suffix) unless the 'depth'\nparameter is passed in the request URL.\n\n\ - Depth can be one of three values:\n\n - 1 : expand sets into ids (slow)\n\ - \ - 2 : expand sets into objects (slower)\n - 0 : dont expand sets at all\ - \ (default behaviour)\n\n**example**\n\n ?depth=1\n\n### Cached Responses\n\ - \nAny request that does not require lookups will be served a cached result.\ - \ Cache is updated approximately every 15 minutes.\n\nYou can spot cached\ - \ responses by checking for the \"generated\" property inside the \"meta\"\ - \ object.\n\n \"meta\" : {\n // the cached data was last regenerated\ - \ at this time (epoch)\n \"generated\" : 1456121358.6301942\n }\n\ - \n**examples**\n\nwill serve a cached result:\n\n ?depth=2\n\nwill serve\ - \ a live result:\n\n ?id__in=1,2\n\n### Resultset limit\n\nAny request\ - \ that does lookup queries and has it's **depth** parameter specified will\ - \ have a result limit of 250 entries, any entries past this limit will be\ - \ truncated, at which point you either should be more specific with your query\ - \ or use the skip and limit parameters to page through the result set\n\n\ - **examples**\n\nwill serve a live result and a maximum of 250 rows at a time:\n\ - \n ?updated__gt=2011-01-01&depth=1\n\nwill serve a live result and will\ - \ not be truncated:\n\n ?updated__gt=2011-01-01\n\nwill serve a cached\ - \ result and will not be truncated:\n\n ?depth=1\n\n### Pagination\n\n\ - Use the skip and limit parameters to page through results\n\n ?updated__gt=2011-01-01&depth=1&limit=250\ - \ - first page\n ?updated__gt=2011-01-01&depth=1&limit=250&skip=250 - second\ - \ page\n ?updated__gt=2011-01-01&depth=1&limit=250&skip=500 - third page\n" + \ Exchange connection\n\nIdentified by the `netixlan` tag.\n\n### Parent relationship:\n\ + \n- `net` network\n\n### Relationship(s):\n\n- `ixlan` internet exchange network\ + \ information\n\n\n## List objects\n\n### Querying\n\nYou may query the resultset\ + \ by passing field names as url parameters\n\n### Numeric Queries\n\nOn numeric\ + \ fields you can suffix the field names with the following filters:\n\n- \\\ + _\\_lt : less-than\n- \\_\\_lte : less-than-equal\n- \\_\\_gt : greater-than\n\ + - \\_\\_gte : greater-than-equal\n- \\_\\_in : value inside set of values\ + \ (comma separated)\n\n**examples**\n\n ?__lt=10\n ?__in=1,10\n\ + \n### String Queries\n\nOn string fields you can suffix the field names with\ + \ the following filters:\n\n- \\_\\_contains : field value contains specified\ + \ value\n- \\_\\_startswith : field value starts with specified value\n- \\\ + _\\_in : value contained inside set of values (comma separated)\n\n**examples**\n\ + \n ?__contains=something\n ?__in=this,that\n\ + \nAll string filtering operations are case-insensitive\n\n### Since\n\n\n\ + You can use the since argument with a unix timestamp (seconds) to retrieve\ + \ all\nobjects updated since then. Note that this result will contain objects\ + \ that were\ndeleted in that timeframe as well - you can spot them by checking\ + \ for status \"deleted\"\n\n**example**\n\n ?since=1443414678\n\n### Nested\ + \ data\n\nAny field ending in the suffix **_set** (with the exception of 'irr_as_set')\ + \ is a list of objects in a relationship with the parent\nobject, you can\ + \ expand those lists with the 'depth' parameter as explained below.\n\nThe\ + \ naming schema of the field will always tell you which type of object the\ + \ set is holding\nand will correspond with the object's endpoint on the API\n\ + \n _set\n\nSo a set called 'net_set' will hold Network objects\ + \ (api endpoint /net)\n\n### Depth\n\nNested sets will not be loaded (any\ + \ field ending with the _set suffix, with the exception of 'irr_as_set') unless\ + \ the 'depth'\nparameter is passed in the request URL.\n\nDepth can be one\ + \ of three values:\n\n - 1 : expand sets into ids (slow)\n - 2 : expand\ + \ sets into objects (slower)\n - 0 : don't expand sets at all (default behaviour)\n\ + \n**example**\n\n ?depth=1\n\n### Cached Responses\n\nAny request that\ + \ does not require lookups will be served a cached result. Cache is updated\ + \ approximately every 15 minutes.\n\nYou can spot cached responses by checking\ + \ for the \"generated\" property inside the \"meta\" object.\n\n \"meta\"\ + \ : {\n // the cached data was last regenerated at this time (epoch)\n\ + \ \"generated\" : 1456121358.6301942\n }\n\n**examples**\n\nwill\ + \ serve a cached result:\n\n ?depth=2\n\nwill serve a live result:\n\n\ + \ ?id__in=1,2\n\n### Resultset limit\n\nAny request that does lookup queries\ + \ and has it's **depth** parameter specified will have a result limit of 250\ + \ entries, any entries past this limit will be truncated, at which point you\ + \ either should be more specific with your query or use the skip and limit\ + \ parameters to page through the result set\n\n**examples**\n\nwill serve\ + \ a live result and a maximum of 250 rows at a time:\n\n ?updated__gt=2011-01-01&depth=1\n\ + \nwill serve a live result and will not be truncated:\n\n ?updated__gt=2011-01-01\n\ + \nwill serve a cached result and will not be truncated:\n\n ?depth=1\n\n\ + ### Pagination\n\nUse the skip and limit parameters to page through results\n\ + \n ?updated__gt=2011-01-01&depth=1&limit=250 - first page\n ?updated__gt=2011-01-01&depth=1&limit=250&skip=250\ + \ - second page\n ?updated__gt=2011-01-01&depth=1&limit=250&skip=500 -\ + \ third page\n" parameters: - name: asn in: query @@ -19657,6 +15189,19 @@ paths: required: false schema: type: date-time + - name: ixlan__ixf_ixp_import_protocol_conflict + in: query + description: 'IX has been sending IP addresses for protocol not supported + by network + + + Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: integer - name: ixlan__ixf_ixp_member_list_url_visible in: query description: 'Filter results by matching a value against this field. @@ -19762,7 +15307,7 @@ paths: type: string - name: net__allow_ixp_update in: query - description: 'Sepcifies whether an ixp is allowed to add a netixlan entry + description: 'Specifies whether an IXP is allowed to add a netixlan entry for this network via their ixp_member data @@ -19788,6 +15333,18 @@ paths: required: false schema: type: date-time + - name: net__fac_count + in: query + description: 'number of facilities at this network + + + Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: integer - name: net__id in: query description: 'Filter results by matching a value against this field. @@ -19821,8 +15378,8 @@ paths: type: integer - name: net__info_prefixes4 in: query - description: 'Recommended IPv4 maximum-prefix limit to be configured on peering - sessions for this ASN + description: 'Recommended maximum number of IPv4 routes/prefixes to be configured + on peering sessions for this ASN Filter results by matching a value against this field. @@ -19834,8 +15391,8 @@ paths: type: integer - name: net__info_prefixes6 in: query - description: 'Recommended IPv6 maximum-prefix limit to be configured on peering - sessions for this ASN + description: 'Recommended maximum number of IPv6 routes/prefixes to be configured + on peering sessions for this ASN Filter results by matching a value against this field. @@ -19892,7 +15449,7 @@ paths: ``, `Not Disclosed`, `NSP`, `Content`, `Cable/DSL/ISP`, `Enterprise`, `Educational/Research`, - `Non-Profit`, `Route Server` + `Non-Profit`, `Route Server`, `Network Services`, `Route Collector`, `Government` Supported filter suffixes: `__startswith`, `__contains`, `__in`' @@ -19918,6 +15475,18 @@ paths: required: false schema: type: string + - name: net__ix_count + in: query + description: 'number of exchanges at this network + + + Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: integer - name: net__looking_glass in: query description: 'Filter results by matching a value against this field. @@ -19936,6 +15505,33 @@ paths: required: false schema: type: string + - name: net__name_long + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: net__netfac_updated + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: date-time + - name: net__netixlan_updated + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: date-time - name: net__notes in: query description: 'Filter results by matching a value against this field. @@ -19945,6 +15541,15 @@ paths: required: false schema: type: string + - name: net__poc_updated + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: date-time - name: net__policy_contracts in: query description: 'Filter results by matching a value against this field. @@ -20123,92 +15728,103 @@ paths: schema: type: array items: - properties: - id: - type: integer - readOnly: true - net_id: - type: integer - net: - type: string - readOnly: true - ix_id: - type: string - readOnly: true - name: - type: string - readOnly: true - ixlan_id: - type: string - ixlan: - type: string - readOnly: true - notes: - type: string - maxLength: 255 - speed: - type: integer - maximum: 4294967295 - format: int64 - minimum: 0 - asn: - type: integer - maximum: 4294967295 - format: int64 - minimum: 0 - ipaddr4: - type: string - ipaddr6: - type: string - is_rs_peer: - type: boolean - operational: - type: boolean - created: - type: string - format: date-time - readOnly: true - updated: - type: string - format: date-time - readOnly: true - status: - type: string - maxLength: 255 - required: - - net_id - - ixlan_id - - speed - - asn - - ipaddr4 - - ipaddr6 + $ref: '#/components/schemas/NetworkIXLan' description: '' + tags: + - api post: operationId: create netixlan - description: "Creates a new `netixlan` type object.\n\n## Network to Internet\ - \ Exchange connection \n\nIdentified by the `netixlan` tag.\n\n### Parent\ - \ relationship:\n\n- `net` network\n\n### Relationship(s):\n\n- `ixlan` internet\ - \ exchange network information\n\n\n## Creating objects\n\n### Status `pending`\n\ - \nSome object types will be flagged as `pending` until they have been reviewed\ - \ and approved by peeringdb staff.\n\nCurrently this is the case for:\n\n\n\ - - `org` organizations (only administrative staff users are currently allowed\ - \ to create organizations)\n- `fac` facilities\n- `net` networks\n- `ix` exchanges\n\ - - `ixpfx` prefixes (if part of a new exchange)\n- `ixlan` exchange networks\ - \ (if part of a new exchange)\n\n### Permissions\n\nTo be able to create an\ - \ object, the requesting user requires `create` permissions to one of the\n\ - object's parents in the relationship hierarchy.\n\nFor example to create a\ - \ `net` type object, the user needs to be permissioned to create in the organzation\n\ - that is to be the network's holder entity.\n" + description: 'Creates a new `netixlan` type object. + + + ## Network to Internet Exchange connection + + + Identified by the `netixlan` tag. + + + ### Parent relationship: + + + - `net` network + + + ### Relationship(s): + + + - `ixlan` internet exchange network information + + + + ## Creating objects + + + ### Status `pending` + + + Some object types will be flagged as `pending` until they have been reviewed + and approved by peeringdb staff. + + + Currently this is the case for: + + + + - `org` organizations (only administrative staff users are currently allowed + to create organizations) + + - `fac` facilities + + - `net` networks + + - `ix` exchanges + + - `ixpfx` prefixes (if part of a new exchange) + + - `ixlan` exchange networks (if part of a new exchange) + + + ### Permissions + + + To be able to create an object, the requesting user requires `create` permissions + to one of the + + object''s parents in the relationship hierarchy. + + + For example to create a `net` type object, the user needs to be permissioned + to create in the organization + + that is to be the network''s holder entity. + + ' parameters: [] requestBody: content: application/json: - schema: &id023 + schema: + type: object properties: + id: + type: integer + readOnly: true net_id: type: integer + net: + type: string + readOnly: true + ix_id: + type: string + readOnly: true + name: + type: string + readOnly: true ixlan_id: type: string + ixlan: + type: string + readOnly: true notes: type: string maxLength: 255 @@ -20230,6 +15846,14 @@ paths: type: boolean operational: type: boolean + created: + type: string + format: date-time + readOnly: true + updated: + type: string + format: date-time + readOnly: true status: type: string maxLength: 255 @@ -20241,86 +15865,33 @@ paths: - ipaddr4 - ipaddr6 application/x-www-form-urlencoded: - schema: *id023 + schema: + $ref: '#/components/schemas/NetworkIXLan' multipart/form-data: - schema: *id023 + schema: + $ref: '#/components/schemas/NetworkIXLan' responses: - '200': + '201': content: application/json: schema: - properties: - id: - type: integer - readOnly: true - net_id: - type: integer - net: - type: string - readOnly: true - ix_id: - type: string - readOnly: true - name: - type: string - readOnly: true - ixlan_id: - type: string - ixlan: - type: string - readOnly: true - notes: - type: string - maxLength: 255 - speed: - type: integer - maximum: 4294967295 - format: int64 - minimum: 0 - asn: - type: integer - maximum: 4294967295 - format: int64 - minimum: 0 - ipaddr4: - type: string - ipaddr6: - type: string - is_rs_peer: - type: boolean - operational: - type: boolean - created: - type: string - format: date-time - readOnly: true - updated: - type: string - format: date-time - readOnly: true - status: - type: string - maxLength: 255 - required: - - net_id - - ixlan_id - - speed - - asn - - ipaddr4 - - ipaddr6 + $ref: '#/components/schemas/NetworkIXLan' description: '' + tags: + - api /api/netixlan/{id}: get: operationId: retrieve netixlan description: "Retrieves a single `netixlan` type object by id\n\n## Network\ - \ to Internet Exchange connection \n\nIdentified by the `netixlan` tag.\n\n\ + \ to Internet Exchange connection\n\nIdentified by the `netixlan` tag.\n\n\ ### Parent relationship:\n\n- `net` network\n\n### Relationship(s):\n\n- `ixlan`\ \ internet exchange network information\n\n\n## Retrieve a single object\n\ \n### Depth\n\nNested sets will not be expanded (any field ending with the\ - \ _set suffix) unless the 'depth'\nparameter is passed in the request URL.\n\ - \nDepth can be one of three values:\n\n - 1 : expand sets into ids (slow)\n\ - \ - 2 : expand sets into objects (slower)\n - 0 : dont expand sets at all\ - \ (default behaviour)\n\n**example**\n\n ?depth=1\n\n\n" + \ _set suffix, with the exception of 'irr_as_set') unless the 'depth'\nparameter\ + \ is passed in the request URL.\n\nDepth can be one of three values:\n\n \ + \ - 1 : expand sets into ids (slow)\n - 2 : expand sets into objects (slower)\n\ + \ - 0 : don't expand sets at all (default behaviour)\n\n**example**\n\n \ + \ ?depth=1\n" parameters: - name: id in: path @@ -20342,74 +15913,44 @@ paths: content: application/json: schema: - properties: - id: - type: integer - readOnly: true - net_id: - type: integer - net: - type: string - readOnly: true - ix_id: - type: string - readOnly: true - name: - type: string - readOnly: true - ixlan_id: - type: string - ixlan: - type: string - readOnly: true - notes: - type: string - maxLength: 255 - speed: - type: integer - maximum: 4294967295 - format: int64 - minimum: 0 - asn: - type: integer - maximum: 4294967295 - format: int64 - minimum: 0 - ipaddr4: - type: string - ipaddr6: - type: string - is_rs_peer: - type: boolean - operational: - type: boolean - created: - type: string - format: date-time - readOnly: true - updated: - type: string - format: date-time - readOnly: true - status: - type: string - maxLength: 255 - required: - - net_id - - ixlan_id - - speed - - asn - - ipaddr4 - - ipaddr6 + $ref: '#/components/schemas/NetworkIXLan' description: '' + tags: + - api put: operationId: update netixlan - description: "Updates an existing `netixlan` type object.\n\n## Network to Internet\ - \ Exchange connection \n\nIdentified by the `netixlan` tag.\n\n### Parent\ - \ relationship:\n\n- `net` network\n\n### Relationship(s):\n\n- `ixlan` internet\ - \ exchange network information\n\n\n## Update existing objects\n\n### Permissions\n\ - \nIn order to update an object the requesting user requires `update` permissions\ - \ to the object itself or one of the parent relationships in the object hierarchy\n" + description: 'Updates an existing `netixlan` type object. + + + ## Network to Internet Exchange connection + + + Identified by the `netixlan` tag. + + + ### Parent relationship: + + + - `net` network + + + ### Relationship(s): + + + - `ixlan` internet exchange network information + + + + ## Update existing objects + + + ### Permissions + + + In order to update an object the requesting user requires `update` permissions + to the object itself or one of the parent relationships in the object hierarchy + + ' parameters: - name: id in: path @@ -20420,12 +15961,28 @@ paths: requestBody: content: application/json: - schema: &id024 + schema: + type: object properties: + id: + type: integer + readOnly: true net_id: type: integer + net: + type: string + readOnly: true + ix_id: + type: string + readOnly: true + name: + type: string + readOnly: true ixlan_id: type: string + ixlan: + type: string + readOnly: true notes: type: string maxLength: 255 @@ -20447,6 +16004,14 @@ paths: type: boolean operational: type: boolean + created: + type: string + format: date-time + readOnly: true + updated: + type: string + format: date-time + readOnly: true status: type: string maxLength: 255 @@ -20458,80 +16023,43 @@ paths: - ipaddr4 - ipaddr6 application/x-www-form-urlencoded: - schema: *id024 + schema: + $ref: '#/components/schemas/NetworkIXLan' multipart/form-data: - schema: *id024 + schema: + $ref: '#/components/schemas/NetworkIXLan' responses: '200': content: application/json: schema: - properties: - id: - type: integer - readOnly: true - net_id: - type: integer - net: - type: string - readOnly: true - ix_id: - type: string - readOnly: true - name: - type: string - readOnly: true - ixlan_id: - type: string - ixlan: - type: string - readOnly: true - notes: - type: string - maxLength: 255 - speed: - type: integer - maximum: 4294967295 - format: int64 - minimum: 0 - asn: - type: integer - maximum: 4294967295 - format: int64 - minimum: 0 - ipaddr4: - type: string - ipaddr6: - type: string - is_rs_peer: - type: boolean - operational: - type: boolean - created: - type: string - format: date-time - readOnly: true - updated: - type: string - format: date-time - readOnly: true - status: - type: string - maxLength: 255 - required: - - net_id - - ixlan_id - - speed - - asn - - ipaddr4 - - ipaddr6 + $ref: '#/components/schemas/NetworkIXLan' description: '' + tags: + - api patch: operationId: patch netixlan - description: "PATCH (partial update) is currently disabled\n\n## Network to\ - \ Internet Exchange connection \n\nIdentified by the `netixlan` tag.\n\n###\ - \ Parent relationship:\n\n- `net` network\n\n### Relationship(s):\n\n- `ixlan`\ - \ internet exchange network information\n" + description: 'PATCH (partial update) is currently disabled. + + + ## Network to Internet Exchange connection + + + Identified by the `netixlan` tag. + + + ### Parent relationship: + + + - `net` network + + + ### Relationship(s): + + + - `ixlan` internet exchange network information + + ' parameters: - name: id in: path @@ -20542,12 +16070,28 @@ paths: requestBody: content: application/json: - schema: &id025 + schema: + type: object properties: + id: + type: integer + readOnly: true net_id: type: integer + net: + type: string + readOnly: true + ix_id: + type: string + readOnly: true + name: + type: string + readOnly: true ixlan_id: type: string + ixlan: + type: string + readOnly: true notes: type: string maxLength: 255 @@ -20569,84 +16113,66 @@ paths: type: boolean operational: type: boolean + created: + type: string + format: date-time + readOnly: true + updated: + type: string + format: date-time + readOnly: true status: type: string maxLength: 255 + required: + - net_id + - ixlan_id + - speed + - asn + - ipaddr4 + - ipaddr6 application/x-www-form-urlencoded: - schema: *id025 + schema: + $ref: '#/components/schemas/NetworkIXLan' multipart/form-data: - schema: *id025 + schema: + $ref: '#/components/schemas/NetworkIXLan' responses: '200': content: application/json: schema: - properties: - id: - type: integer - readOnly: true - net_id: - type: integer - net: - type: string - readOnly: true - ix_id: - type: string - readOnly: true - name: - type: string - readOnly: true - ixlan_id: - type: string - ixlan: - type: string - readOnly: true - notes: - type: string - maxLength: 255 - speed: - type: integer - maximum: 4294967295 - format: int64 - minimum: 0 - asn: - type: integer - maximum: 4294967295 - format: int64 - minimum: 0 - ipaddr4: - type: string - ipaddr6: - type: string - is_rs_peer: - type: boolean - operational: - type: boolean - created: - type: string - format: date-time - readOnly: true - updated: - type: string - format: date-time - readOnly: true - status: - type: string - maxLength: 255 - required: - - net_id - - ixlan_id - - speed - - asn - - ipaddr4 - - ipaddr6 + $ref: '#/components/schemas/NetworkIXLan' description: '' + tags: + - api delete: operationId: delete netixlan - description: "Marks an `netixlan` type object as `deleted`.\n\n## Network to\ - \ Internet Exchange connection \n\nIdentified by the `netixlan` tag.\n\n###\ - \ Parent relationship:\n\n- `net` network\n\n### Relationship(s):\n\n- `ixlan`\ - \ internet exchange network information\n\n\n## Deleting objects\n" + description: 'Marks an `netixlan` type object as `deleted`. + + + ## Network to Internet Exchange connection + + + Identified by the `netixlan` tag. + + + ### Parent relationship: + + + - `net` network + + + ### Relationship(s): + + + - `ixlan` internet exchange network information + + + + ## Deleting objects + + ' parameters: - name: id in: path @@ -20657,6 +16183,8 @@ paths: responses: '204': description: '' + tags: + - api /api/org: get: operationId: list org @@ -20680,16 +16208,17 @@ paths: \ all\nobjects updated since then. Note that this result will contain objects\ \ that were\ndeleted in that timeframe as well - you can spot them by checking\ \ for status \"deleted\"\n\n**example**\n\n ?since=1443414678\n\n### Nested\ - \ data\n\nAny field ending in the suffix **_set** is a list of objects in\ - \ a relationship with the parent\nobject, you can expand those lists with\ - \ the 'depth' parameter as explained below.\n\nThe naming schema of the field\ - \ will always tell you which type of object the set is holding\nand will correspond\ - \ with the object's endpoint on the API\n\n _set\n\nSo a set\ - \ called 'net_set' will hold Network objects (api endpoint /net)\n\n### Depth\n\ - \nNested sets will not be loaded (any field ending with the _set suffix) unless\ + \ data\n\nAny field ending in the suffix **_set** (with the exception of 'irr_as_set')\ + \ is a list of objects in a relationship with the parent\nobject, you can\ + \ expand those lists with the 'depth' parameter as explained below.\n\nThe\ + \ naming schema of the field will always tell you which type of object the\ + \ set is holding\nand will correspond with the object's endpoint on the API\n\ + \n _set\n\nSo a set called 'net_set' will hold Network objects\ + \ (api endpoint /net)\n\n### Depth\n\nNested sets will not be loaded (any\ + \ field ending with the _set suffix, with the exception of 'irr_as_set') unless\ \ the 'depth'\nparameter is passed in the request URL.\n\nDepth can be one\ \ of three values:\n\n - 1 : expand sets into ids (slow)\n - 2 : expand\ - \ sets into objects (slower)\n - 0 : dont expand sets at all (default behaviour)\n\ + \ sets into objects (slower)\n - 0 : don't expand sets at all (default behaviour)\n\ \n**example**\n\n ?depth=1\n\n### Cached Responses\n\nAny request that\ \ does not require lookups will be served a cached result. Cache is updated\ \ approximately every 15 minutes.\n\nYou can spot cached responses by checking\ @@ -20724,6 +16253,15 @@ paths: description: 'Filter results by matching a value against this field. + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: aka + in: query + description: 'Filter results by matching a value against this field. + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' required: false schema: @@ -20796,6 +16334,58 @@ paths: default: 0 minimum: 0 maximum: 2 + - name: flagged + in: query + description: 'Flag the organization for deletion + + + Filter results by matching a value against this field.' + required: false + schema: + type: integer + - name: flagged_date + in: query + description: 'Date when the organization was flagged + + + Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: date-time + - name: floor + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: geocode_date + in: query + description: 'Last time of attempted geocode + + + Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: date-time + - name: geocode_status + in: query + description: 'Has this object''s address been normalized with a call to the + Google Maps API + + + Filter results by matching a value against this field.' + required: false + schema: + type: integer - name: id in: query description: 'Filter results by matching a value against this field. @@ -20835,6 +16425,15 @@ paths: description: 'Filter results by matching a value against this field. + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: name_long + in: query + description: 'Filter results by matching a value against this field. + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' required: false schema: @@ -20876,6 +16475,15 @@ paths: description: 'Filter results by matching a value against this field. + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: suite + in: query + description: 'Filter results by matching a value against this field. + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' required: false schema: @@ -20923,344 +16531,11890 @@ paths: schema: type: array items: + $ref: '#/components/schemas/Organization' + description: '' + tags: + - api + post: + operationId: create org + description: 'Creates a new `org` type object. + + + ## Organization + + + Identified by the `org` tag. + + + The organization is at the top of the peeringdb object hierarchy. + + + ### Parent relationship: + + + - None + + + ### Children relationship(s): + + + - `net` networks + + - `fac` facilities + + - `ix` exchanges + + + + ## Creating objects + + + ### Status `pending` + + + Some object types will be flagged as `pending` until they have been reviewed + and approved by peeringdb staff. + + + Currently this is the case for: + + + + - `org` organizations (only administrative staff users are currently allowed + to create organizations) + + - `fac` facilities + + - `net` networks + + - `ix` exchanges + + - `ixpfx` prefixes (if part of a new exchange) + + - `ixlan` exchange networks (if part of a new exchange) + + + ### Permissions + + + To be able to create an object, the requesting user requires `create` permissions + to one of the + + object''s parents in the relationship hierarchy. + + + For example to create a `net` type object, the user needs to be permissioned + to create in the organization + + that is to be the network''s holder entity. + + ' + parameters: [] + requestBody: + content: + application/json: + schema: + type: object + properties: + id: + type: integer + readOnly: true + name: + type: string + maxLength: 255 + aka: + type: string + maxLength: 255 + name_long: + type: string + maxLength: 255 + website: + type: string + format: uri + maxLength: 255 + pattern: "^(?:[a-z0-9.+-]*)://(?:[^\\s:@/]+(?::[^\\s:@/]*)?@)?(?:(?:0|25[0-5]|2[0-4]\\\ + d|1\\d?\\d?|[1-9]\\d?)(?:\\.(?:0|25[0-5]|2[0-4]\\d|1\\d?\\d?|[1-9]\\\ + d?)){3}|\\[[0-9a-f:.]+\\]|([a-z\xA1-\uFFFF0-9](?:[a-z\xA1-\uFFFF\ + 0-9-]{0,61}[a-z\xA1-\uFFFF0-9])?(?:\\.(?!-)[a-z\xA1-\uFFFF0-9-]{1,63}(?__lt=10\n ?__in=1,10\n\ + \n### String Queries\n\nOn string fields you can suffix the field names with\ + \ the following filters:\n\n- \\_\\_contains : field value contains specified\ + \ value\n- \\_\\_startswith : field value starts with specified value\n- \\\ + _\\_in : value contained inside set of values (comma separated)\n\n**examples**\n\ + \n ?__contains=something\n ?__in=this,that\n\ + \nAll string filtering operations are case-insensitive\n\n### Since\n\n\n\ + You can use the since argument with a unix timestamp (seconds) to retrieve\ + \ all\nobjects updated since then. Note that this result will contain objects\ + \ that were\ndeleted in that timeframe as well - you can spot them by checking\ + \ for status \"deleted\"\n\n**example**\n\n ?since=1443414678\n\n### Nested\ + \ data\n\nAny field ending in the suffix **_set** (with the exception of 'irr_as_set')\ + \ is a list of objects in a relationship with the parent\nobject, you can\ + \ expand those lists with the 'depth' parameter as explained below.\n\nThe\ + \ naming schema of the field will always tell you which type of object the\ + \ set is holding\nand will correspond with the object's endpoint on the API\n\ + \n _set\n\nSo a set called 'net_set' will hold Network objects\ + \ (api endpoint /net)\n\n### Depth\n\nNested sets will not be loaded (any\ + \ field ending with the _set suffix, with the exception of 'irr_as_set') unless\ + \ the 'depth'\nparameter is passed in the request URL.\n\nDepth can be one\ + \ of three values:\n\n - 1 : expand sets into ids (slow)\n - 2 : expand\ + \ sets into objects (slower)\n - 0 : don't expand sets at all (default behaviour)\n\ + \n**example**\n\n ?depth=1\n\n### Cached Responses\n\nAny request that\ + \ does not require lookups will be served a cached result. Cache is updated\ + \ approximately every 15 minutes.\n\nYou can spot cached responses by checking\ + \ for the \"generated\" property inside the \"meta\" object.\n\n \"meta\"\ + \ : {\n // the cached data was last regenerated at this time (epoch)\n\ + \ \"generated\" : 1456121358.6301942\n }\n\n**examples**\n\nwill\ + \ serve a cached result:\n\n ?depth=2\n\nwill serve a live result:\n\n\ + \ ?id__in=1,2\n\n### Resultset limit\n\nAny request that does lookup queries\ + \ and has it's **depth** parameter specified will have a result limit of 250\ + \ entries, any entries past this limit will be truncated, at which point you\ + \ either should be more specific with your query or use the skip and limit\ + \ parameters to page through the result set\n\n**examples**\n\nwill serve\ + \ a live result and a maximum of 250 rows at a time:\n\n ?updated__gt=2011-01-01&depth=1\n\ + \nwill serve a live result and will not be truncated:\n\n ?updated__gt=2011-01-01\n\ + \nwill serve a cached result and will not be truncated:\n\n ?depth=1\n\n\ + ### Pagination\n\nUse the skip and limit parameters to page through results\n\ + \n ?updated__gt=2011-01-01&depth=1&limit=250 - first page\n ?updated__gt=2011-01-01&depth=1&limit=250&skip=250\ + \ - second page\n ?updated__gt=2011-01-01&depth=1&limit=250&skip=500 -\ + \ third page\n" + parameters: + - name: aka + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: allow_ixp_update + in: query + description: 'Specifies whether an IXP is allowed to add a netixlan entry + for this network via their ixp_member data + + + Filter results by matching a value against this field.' + required: false + schema: + type: integer + - name: asn + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: integer + - name: created + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: date-time + - name: depth + in: query + required: false + description: Expand nested sets according to depth. + schema: + type: integer + default: 0 + minimum: 0 + maximum: 2 + - name: fac + in: query + description: 'Find networks present at a facility (facility id) + + + Filter results by matching a value against this field.' + required: false + schema: + type: number + - name: fac_count + in: query + description: 'number of facilities at this network + + + Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: integer + - name: id + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: integer + - name: info_ipv6 + in: query + description: Filter results by matching a value against this field. + required: false + schema: + type: integer + - name: info_multicast + in: query + description: Filter results by matching a value against this field. + required: false + schema: + type: integer + - name: info_never_via_route_servers + in: query + description: 'Indicates if this network will announce its routes via route + servers or not + + + Filter results by matching a value against this field.' + required: false + schema: + type: integer + - name: info_prefixes4 + in: query + description: 'Recommended maximum number of IPv4 routes/prefixes to be configured + on peering sessions for this ASN + + + Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: integer + - name: info_prefixes6 + in: query + description: 'Recommended maximum number of IPv6 routes/prefixes to be configured + on peering sessions for this ASN + + + Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: integer + - name: info_ratio + in: query + description: 'Filter results by matching a value against this field. + + + ``, `Not Disclosed`, `Heavy Outbound`, `Mostly Outbound`, `Balanced`, `Mostly + Inbound`, `Heavy Inbound` + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: info_scope + in: query + description: 'Filter results by matching a value against this field. + + + ``, `Not Disclosed`, `Regional`, `North America`, `Asia Pacific`, `Europe`, + `South America`, `Africa`, `Australia`, `Middle East`, `Global` + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: info_traffic + in: query + description: 'Filter results by matching a value against this field. + + + ``, `0-20Mbps`, `20-100Mbps`, `100-1000Mbps`, `1-5Gbps`, `5-10Gbps`, `10-20Gbps`, + `20-50Gbps`, `50-100Gbps`, `100-200Gbps`, `200-300Gbps`, `300-500Gbps`, + `500-1000Gbps`, `1-5Tbps`, `5-10Tbps`, `10-20Tbps`, `20-50Tbps`, `50-100Tbps`, + `100+Tbps` + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: info_type + in: query + description: 'Filter results by matching a value against this field. + + + ``, `Not Disclosed`, `NSP`, `Content`, `Cable/DSL/ISP`, `Enterprise`, `Educational/Research`, + `Non-Profit`, `Route Server`, `Network Services`, `Route Collector`, `Government` + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: info_unicast + in: query + description: Filter results by matching a value against this field. + required: false + schema: + type: integer + - name: irr_as_set + in: query + description: 'Reference to an AS-SET or ROUTE-SET in Internet Routing Registry + (IRR) + + + Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: ix + in: query + description: 'Find networks present at exchange (exchange id) + + + Filter results by matching a value against this field.' + required: false + schema: + type: number + - name: ix_count + in: query + description: 'number of exchanges at this network + + + Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: integer + - name: ixlan + in: query + description: 'Find networks connected at ixlan (ixlan id) + + + Filter results by matching a value against this field.' + required: false + schema: + type: number + - name: limit + in: query + required: false + description: Limit the number of rows returned in the result set (use for + pagination in combination with `skip`) + schema: + type: integer + - name: looking_glass + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: name + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: name_long + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: name_search + in: query + description: 'Targets both AKA and name fields for filtering + + + Filter results by matching a value against this field.' + required: false + schema: + type: string + - name: netfac + in: query + description: 'Find the network that this netfac belongs to (netfac id) + + + Filter results by matching a value against this field.' + required: false + schema: + type: number + - name: netfac_updated + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: date-time + - name: netixlan + in: query + description: 'Find the network that contains this netixlan (netixlan id) + + + Filter results by matching a value against this field.' + required: false + schema: + type: number + - name: netixlan_updated + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: date-time + - name: not_fac + in: query + description: 'Find networks not present at a facility (facility id) + + + Filter results by matching a value against this field.' + required: false + schema: + type: number + - name: not_ix + in: query + description: 'Find networks not present at an exchange (exchange id) + + + Filter results by matching a value against this field.' + required: false + schema: + type: number + - name: notes + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: notes_private + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: org + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: integer + - name: org__address1 + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: org__address2 + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: org__aka + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: org__city + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: org__country + in: query + description: 'Filter results by matching a value against this field. + + + `AF`, `AX`, `AL`, `DZ`, `AS`, `AD`, `AO`, `AI`, `AQ`, `AG`, `AR`, `AM`, + `AW`, `AU`, `AT`, `AZ`, `BS`, `BH`, `BD`, `BB`, `BY`, `BE`, `BZ`, `BJ`, + `BM`, `BT`, `BO`, `BQ`, `BA`, `BW`, `BV`, `BR`, `IO`, `BN`, `BG`, `BF`, + `BI`, `CV`, `KH`, `CM`, `CA`, `KY`, `CF`, `TD`, `CL`, `CN`, `CX`, `CC`, + `CO`, `KM`, `CG`, `CD`, `CK`, `CR`, `CI`, `HR`, `CU`, `CW`, `CY`, `CZ`, + `DK`, `DJ`, `DM`, `DO`, `EC`, `EG`, `SV`, `GQ`, `ER`, `EE`, `SZ`, `ET`, + `FK`, `FO`, `FJ`, `FI`, `FR`, `GF`, `PF`, `TF`, `GA`, `GM`, `GE`, `DE`, + `GH`, `GI`, `GR`, `GL`, `GD`, `GP`, `GU`, `GT`, `GG`, `GN`, `GW`, `GY`, + `HT`, `HM`, `VA`, `HN`, `HK`, `HU`, `IS`, `IN`, `ID`, `IR`, `IQ`, `IE`, + `IM`, `IL`, `IT`, `JM`, `JP`, `JE`, `JO`, `KZ`, `KE`, `KI`, `XK`, `KW`, + `KG`, `LA`, `LV`, `LB`, `LS`, `LR`, `LY`, `LI`, `LT`, `LU`, `MO`, `MG`, + `MW`, `MY`, `MV`, `ML`, `MT`, `MH`, `MQ`, `MR`, `MU`, `YT`, `MX`, `FM`, + `MD`, `MC`, `MN`, `ME`, `MS`, `MA`, `MZ`, `MM`, `NA`, `NR`, `NP`, `NL`, + `NC`, `NZ`, `NI`, `NE`, `NG`, `NU`, `NF`, `KP`, `MK`, `MP`, `NO`, `OM`, + `PK`, `PW`, `PS`, `PA`, `PG`, `PY`, `PE`, `PH`, `PN`, `PL`, `PT`, `PR`, + `QA`, `RE`, `RO`, `RU`, `RW`, `BL`, `SH`, `KN`, `LC`, `MF`, `PM`, `VC`, + `WS`, `SM`, `ST`, `SA`, `SN`, `RS`, `SC`, `SL`, `SG`, `SX`, `SK`, `SI`, + `SB`, `SO`, `ZA`, `GS`, `KR`, `SS`, `ES`, `LK`, `SD`, `SR`, `SJ`, `SE`, + `CH`, `SY`, `TW`, `TJ`, `TZ`, `TH`, `TL`, `TG`, `TK`, `TO`, `TT`, `TN`, + `TR`, `TM`, `TC`, `TV`, `UG`, `UA`, `AE`, `GB`, `UM`, `US`, `UY`, `UZ`, + `VU`, `VE`, `VN`, `VG`, `VI`, `WF`, `EH`, `YE`, `ZM`, `ZW` + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: org__created + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: date-time + - name: org__flagged + in: query + description: 'Flag the organization for deletion + + + Filter results by matching a value against this field.' + required: false + schema: + type: integer + - name: org__flagged_date + in: query + description: 'Date when the organization was flagged + + + Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: date-time + - name: org__floor + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: org__geocode_date + in: query + description: 'Last time of attempted geocode + + + Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: date-time + - name: org__geocode_status + in: query + description: 'Has this object''s address been normalized with a call to the + Google Maps API + + + Filter results by matching a value against this field.' + required: false + schema: + type: integer + - name: org__id + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: integer + - name: org__name + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: org__name_long + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: org__notes + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: org__state + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: org__status + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: org__suite + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: org__updated + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: date-time + - name: org__version + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: integer + - name: org__website + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: org__zipcode + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: poc_updated + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: date-time + - name: policy_contracts + in: query + description: 'Filter results by matching a value against this field. + + + `Not Required`, `Private Only`, `Required` + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: policy_general + in: query + description: 'Filter results by matching a value against this field. + + + `Open`, `Selective`, `Restrictive`, `No` + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: policy_locations + in: query + description: 'Filter results by matching a value against this field. + + + `Not Required`, `Preferred`, `Required - US`, `Required - EU`, `Required + - International` + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: policy_ratio + in: query + description: Filter results by matching a value against this field. + required: false + schema: + type: integer + - name: policy_url + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: route_server + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: since + in: query + required: false + description: Unix epoch time stamp (seconds). Only return objects that have + been updated since then + schema: + type: integer + - name: skip + in: query + required: false + description: Skip n results in the result set (use for pagination in combination + with `limit`) + schema: + type: integer + - name: status + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: updated + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: date-time + - name: version + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: integer + - name: website + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + responses: + '200': + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/ASSet' + description: '' + tags: + - api + /api/as_set/{asn}: + get: + operationId: list as-set by asn + description: "Retrieves a list of `net` type objects\n\n## Network\n\nIdentified\ + \ by the `net` tag.\n\n### Parent relationship:\n\n- `org` organization\n\n\ + ### Relationship(s):\n\n- `netixlan` network to exchange connections (through\ + \ `ixlan`)\n- `netfac` network / facility presence\n- `poc` points of contact\n\ + \n\n## List objects\n\n### Querying\n\nYou may query the resultset by passing\ + \ field names as url parameters\n\n### Numeric Queries\n\nOn numeric fields\ + \ you can suffix the field names with the following filters:\n\n- \\_\\_lt\ + \ : less-than\n- \\_\\_lte : less-than-equal\n- \\_\\_gt : greater-than\n\ + - \\_\\_gte : greater-than-equal\n- \\_\\_in : value inside set of values\ + \ (comma separated)\n\n**examples**\n\n ?__lt=10\n ?__in=1,10\n\ + \n### String Queries\n\nOn string fields you can suffix the field names with\ + \ the following filters:\n\n- \\_\\_contains : field value contains specified\ + \ value\n- \\_\\_startswith : field value starts with specified value\n- \\\ + _\\_in : value contained inside set of values (comma separated)\n\n**examples**\n\ + \n ?__contains=something\n ?__in=this,that\n\ + \nAll string filtering operations are case-insensitive\n\n### Since\n\n\n\ + You can use the since argument with a unix timestamp (seconds) to retrieve\ + \ all\nobjects updated since then. Note that this result will contain objects\ + \ that were\ndeleted in that timeframe as well - you can spot them by checking\ + \ for status \"deleted\"\n\n**example**\n\n ?since=1443414678\n\n### Nested\ + \ data\n\nAny field ending in the suffix **_set** (with the exception of 'irr_as_set')\ + \ is a list of objects in a relationship with the parent\nobject, you can\ + \ expand those lists with the 'depth' parameter as explained below.\n\nThe\ + \ naming schema of the field will always tell you which type of object the\ + \ set is holding\nand will correspond with the object's endpoint on the API\n\ + \n _set\n\nSo a set called 'net_set' will hold Network objects\ + \ (api endpoint /net)\n\n### Depth\n\nNested sets will not be loaded (any\ + \ field ending with the _set suffix, with the exception of 'irr_as_set') unless\ + \ the 'depth'\nparameter is passed in the request URL.\n\nDepth can be one\ + \ of three values:\n\n - 1 : expand sets into ids (slow)\n - 2 : expand\ + \ sets into objects (slower)\n - 0 : don't expand sets at all (default behaviour)\n\ + \n**example**\n\n ?depth=1\n\n### Cached Responses\n\nAny request that\ + \ does not require lookups will be served a cached result. Cache is updated\ + \ approximately every 15 minutes.\n\nYou can spot cached responses by checking\ + \ for the \"generated\" property inside the \"meta\" object.\n\n \"meta\"\ + \ : {\n // the cached data was last regenerated at this time (epoch)\n\ + \ \"generated\" : 1456121358.6301942\n }\n\n**examples**\n\nwill\ + \ serve a cached result:\n\n ?depth=2\n\nwill serve a live result:\n\n\ + \ ?id__in=1,2\n\n### Resultset limit\n\nAny request that does lookup queries\ + \ and has it's **depth** parameter specified will have a result limit of 250\ + \ entries, any entries past this limit will be truncated, at which point you\ + \ either should be more specific with your query or use the skip and limit\ + \ parameters to page through the result set\n\n**examples**\n\nwill serve\ + \ a live result and a maximum of 250 rows at a time:\n\n ?updated__gt=2011-01-01&depth=1\n\ + \nwill serve a live result and will not be truncated:\n\n ?updated__gt=2011-01-01\n\ + \nwill serve a cached result and will not be truncated:\n\n ?depth=1\n\n\ + ### Pagination\n\nUse the skip and limit parameters to page through results\n\ + \n ?updated__gt=2011-01-01&depth=1&limit=250 - first page\n ?updated__gt=2011-01-01&depth=1&limit=250&skip=250\ + \ - second page\n ?updated__gt=2011-01-01&depth=1&limit=250&skip=500 -\ + \ third page\n" + parameters: + - name: aka + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: allow_ixp_update + in: query + description: 'Specifies whether an IXP is allowed to add a netixlan entry + for this network via their ixp_member data + + + Filter results by matching a value against this field.' + required: false + schema: + type: integer + - name: asn + in: path + required: true + description: '' + schema: + type: string + - name: asn + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: integer + - name: created + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: date-time + - name: depth + in: query + required: false + description: Expand nested sets according to depth. + schema: + type: integer + default: 0 + minimum: 0 + maximum: 2 + - name: fac + in: query + description: 'Find networks present at a facility (facility id) + + + Filter results by matching a value against this field.' + required: false + schema: + type: number + - name: fac_count + in: query + description: 'number of facilities at this network + + + Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: integer + - name: id + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: integer + - name: info_ipv6 + in: query + description: Filter results by matching a value against this field. + required: false + schema: + type: integer + - name: info_multicast + in: query + description: Filter results by matching a value against this field. + required: false + schema: + type: integer + - name: info_never_via_route_servers + in: query + description: 'Indicates if this network will announce its routes via route + servers or not + + + Filter results by matching a value against this field.' + required: false + schema: + type: integer + - name: info_prefixes4 + in: query + description: 'Recommended maximum number of IPv4 routes/prefixes to be configured + on peering sessions for this ASN + + + Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: integer + - name: info_prefixes6 + in: query + description: 'Recommended maximum number of IPv6 routes/prefixes to be configured + on peering sessions for this ASN + + + Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: integer + - name: info_ratio + in: query + description: 'Filter results by matching a value against this field. + + + ``, `Not Disclosed`, `Heavy Outbound`, `Mostly Outbound`, `Balanced`, `Mostly + Inbound`, `Heavy Inbound` + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: info_scope + in: query + description: 'Filter results by matching a value against this field. + + + ``, `Not Disclosed`, `Regional`, `North America`, `Asia Pacific`, `Europe`, + `South America`, `Africa`, `Australia`, `Middle East`, `Global` + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: info_traffic + in: query + description: 'Filter results by matching a value against this field. + + + ``, `0-20Mbps`, `20-100Mbps`, `100-1000Mbps`, `1-5Gbps`, `5-10Gbps`, `10-20Gbps`, + `20-50Gbps`, `50-100Gbps`, `100-200Gbps`, `200-300Gbps`, `300-500Gbps`, + `500-1000Gbps`, `1-5Tbps`, `5-10Tbps`, `10-20Tbps`, `20-50Tbps`, `50-100Tbps`, + `100+Tbps` + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: info_type + in: query + description: 'Filter results by matching a value against this field. + + + ``, `Not Disclosed`, `NSP`, `Content`, `Cable/DSL/ISP`, `Enterprise`, `Educational/Research`, + `Non-Profit`, `Route Server`, `Network Services`, `Route Collector`, `Government` + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: info_unicast + in: query + description: Filter results by matching a value against this field. + required: false + schema: + type: integer + - name: irr_as_set + in: query + description: 'Reference to an AS-SET or ROUTE-SET in Internet Routing Registry + (IRR) + + + Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: ix + in: query + description: 'Find networks present at exchange (exchange id) + + + Filter results by matching a value against this field.' + required: false + schema: + type: number + - name: ix_count + in: query + description: 'number of exchanges at this network + + + Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: integer + - name: ixlan + in: query + description: 'Find networks connected at ixlan (ixlan id) + + + Filter results by matching a value against this field.' + required: false + schema: + type: number + - name: limit + in: query + required: false + description: Limit the number of rows returned in the result set (use for + pagination in combination with `skip`) + schema: + type: integer + - name: looking_glass + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: name + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: name_long + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: name_search + in: query + description: 'Targets both AKA and name fields for filtering + + + Filter results by matching a value against this field.' + required: false + schema: + type: string + - name: netfac + in: query + description: 'Find the network that this netfac belongs to (netfac id) + + + Filter results by matching a value against this field.' + required: false + schema: + type: number + - name: netfac_updated + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: date-time + - name: netixlan + in: query + description: 'Find the network that contains this netixlan (netixlan id) + + + Filter results by matching a value against this field.' + required: false + schema: + type: number + - name: netixlan_updated + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: date-time + - name: not_fac + in: query + description: 'Find networks not present at a facility (facility id) + + + Filter results by matching a value against this field.' + required: false + schema: + type: number + - name: not_ix + in: query + description: 'Find networks not present at an exchange (exchange id) + + + Filter results by matching a value against this field.' + required: false + schema: + type: number + - name: notes + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: notes_private + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: org + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: integer + - name: org__address1 + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: org__address2 + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: org__aka + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: org__city + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: org__country + in: query + description: 'Filter results by matching a value against this field. + + + `AF`, `AX`, `AL`, `DZ`, `AS`, `AD`, `AO`, `AI`, `AQ`, `AG`, `AR`, `AM`, + `AW`, `AU`, `AT`, `AZ`, `BS`, `BH`, `BD`, `BB`, `BY`, `BE`, `BZ`, `BJ`, + `BM`, `BT`, `BO`, `BQ`, `BA`, `BW`, `BV`, `BR`, `IO`, `BN`, `BG`, `BF`, + `BI`, `CV`, `KH`, `CM`, `CA`, `KY`, `CF`, `TD`, `CL`, `CN`, `CX`, `CC`, + `CO`, `KM`, `CG`, `CD`, `CK`, `CR`, `CI`, `HR`, `CU`, `CW`, `CY`, `CZ`, + `DK`, `DJ`, `DM`, `DO`, `EC`, `EG`, `SV`, `GQ`, `ER`, `EE`, `SZ`, `ET`, + `FK`, `FO`, `FJ`, `FI`, `FR`, `GF`, `PF`, `TF`, `GA`, `GM`, `GE`, `DE`, + `GH`, `GI`, `GR`, `GL`, `GD`, `GP`, `GU`, `GT`, `GG`, `GN`, `GW`, `GY`, + `HT`, `HM`, `VA`, `HN`, `HK`, `HU`, `IS`, `IN`, `ID`, `IR`, `IQ`, `IE`, + `IM`, `IL`, `IT`, `JM`, `JP`, `JE`, `JO`, `KZ`, `KE`, `KI`, `XK`, `KW`, + `KG`, `LA`, `LV`, `LB`, `LS`, `LR`, `LY`, `LI`, `LT`, `LU`, `MO`, `MG`, + `MW`, `MY`, `MV`, `ML`, `MT`, `MH`, `MQ`, `MR`, `MU`, `YT`, `MX`, `FM`, + `MD`, `MC`, `MN`, `ME`, `MS`, `MA`, `MZ`, `MM`, `NA`, `NR`, `NP`, `NL`, + `NC`, `NZ`, `NI`, `NE`, `NG`, `NU`, `NF`, `KP`, `MK`, `MP`, `NO`, `OM`, + `PK`, `PW`, `PS`, `PA`, `PG`, `PY`, `PE`, `PH`, `PN`, `PL`, `PT`, `PR`, + `QA`, `RE`, `RO`, `RU`, `RW`, `BL`, `SH`, `KN`, `LC`, `MF`, `PM`, `VC`, + `WS`, `SM`, `ST`, `SA`, `SN`, `RS`, `SC`, `SL`, `SG`, `SX`, `SK`, `SI`, + `SB`, `SO`, `ZA`, `GS`, `KR`, `SS`, `ES`, `LK`, `SD`, `SR`, `SJ`, `SE`, + `CH`, `SY`, `TW`, `TJ`, `TZ`, `TH`, `TL`, `TG`, `TK`, `TO`, `TT`, `TN`, + `TR`, `TM`, `TC`, `TV`, `UG`, `UA`, `AE`, `GB`, `UM`, `US`, `UY`, `UZ`, + `VU`, `VE`, `VN`, `VG`, `VI`, `WF`, `EH`, `YE`, `ZM`, `ZW` + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: org__created + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: date-time + - name: org__flagged + in: query + description: 'Flag the organization for deletion + + + Filter results by matching a value against this field.' + required: false + schema: + type: integer + - name: org__flagged_date + in: query + description: 'Date when the organization was flagged + + + Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: date-time + - name: org__floor + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: org__geocode_date + in: query + description: 'Last time of attempted geocode + + + Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: date-time + - name: org__geocode_status + in: query + description: 'Has this object''s address been normalized with a call to the + Google Maps API + + + Filter results by matching a value against this field.' + required: false + schema: + type: integer + - name: org__id + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: integer + - name: org__name + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: org__name_long + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: org__notes + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: org__state + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: org__status + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: org__suite + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: org__updated + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: date-time + - name: org__version + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: integer + - name: org__website + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: org__zipcode + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: poc_updated + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: date-time + - name: policy_contracts + in: query + description: 'Filter results by matching a value against this field. + + + `Not Required`, `Private Only`, `Required` + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: policy_general + in: query + description: 'Filter results by matching a value against this field. + + + `Open`, `Selective`, `Restrictive`, `No` + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: policy_locations + in: query + description: 'Filter results by matching a value against this field. + + + `Not Required`, `Preferred`, `Required - US`, `Required - EU`, `Required + - International` + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: policy_ratio + in: query + description: Filter results by matching a value against this field. + required: false + schema: + type: integer + - name: policy_url + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: route_server + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: since + in: query + required: false + description: Unix epoch time stamp (seconds). Only return objects that have + been updated since then + schema: + type: integer + - name: skip + in: query + required: false + description: Skip n results in the result set (use for pagination in combination + with `limit`) + schema: + type: integer + - name: status + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + - name: updated + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: date-time + - name: version + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__lt`, `__gt`, `__lte`, `__gte`, `__in`' + required: false + schema: + type: integer + - name: website + in: query + description: 'Filter results by matching a value against this field. + + + Supported filter suffixes: `__startswith`, `__contains`, `__in`' + required: false + schema: + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/ASSet' + description: '' + tags: + - api + /api/ix/{id}/request_ixf_import: + post: + operationId: create IX-F import request + description: 'Creates a new `ix` type object. + + + ## Internet Exchange + + + Identified by the `ix` tag. + + + ### Parent relationship: + + + - `org` organization + + + ### Relationship(s): + + + - `ixlan` internet exchange network information + + - `ixfac` exchange / facility presence + + + + ## Creating objects + + + ### Status `pending` + + + Some object types will be flagged as `pending` until they have been reviewed + and approved by peeringdb staff. + + + Currently this is the case for: + + + + - `org` organizations (only administrative staff users are currently allowed + to create organizations) + + - `fac` facilities + + - `net` networks + + - `ix` exchanges + + - `ixpfx` prefixes (if part of a new exchange) + + - `ixlan` exchange networks (if part of a new exchange) + + + ### Permissions + + + To be able to create an object, the requesting user requires `create` permissions + to one of the + + object''s parents in the relationship hierarchy. + + + For example to create a `net` type object, the user needs to be permissioned + to create in the organization + + that is to be the network''s holder entity. + + ' + parameters: + - name: id + in: path + required: true + description: '' + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + properties: + id: + type: integer + readOnly: true + org_id: + type: integer + org: + type: string + readOnly: true + name: + type: string + maxLength: 64 + aka: + type: string + maxLength: 255 + name_long: + type: string + maxLength: 255 + city: + type: string + maxLength: 192 + country: + enum: + - AF + - AX + - AL + - DZ + - AS + - AD + - AO + - AI + - AQ + - AG + - AR + - AM + - AW + - AU + - AT + - AZ + - BS + - BH + - BD + - BB + - BY + - BE + - BZ + - BJ + - BM + - BT + - BO + - BQ + - BA + - BW + - BV + - BR + - IO + - BN + - BG + - BF + - BI + - CV + - KH + - CM + - CA + - KY + - CF + - TD + - CL + - CN + - CX + - CC + - CO + - KM + - CG + - CD + - CK + - CR + - CI + - HR + - CU + - CW + - CY + - CZ + - DK + - DJ + - DM + - DO + - EC + - EG + - SV + - GQ + - ER + - EE + - SZ + - ET + - FK + - FO + - FJ + - FI + - FR + - GF + - PF + - TF + - GA + - GM + - GE + - DE + - GH + - GI + - GR + - GL + - GD + - GP + - GU + - GT + - GG + - GN + - GW + - GY + - HT + - HM + - VA + - HN + - HK + - HU + - IS + - IN + - ID + - IR + - IQ + - IE + - IM + - IL + - IT + - JM + - JP + - JE + - JO + - KZ + - KE + - KI + - XK + - KW + - KG + - LA + - LV + - LB + - LS + - LR + - LY + - LI + - LT + - LU + - MO + - MG + - MW + - MY + - MV + - ML + - MT + - MH + - MQ + - MR + - MU + - YT + - MX + - FM + - MD + - MC + - MN + - ME + - MS + - MA + - MZ + - MM + - NA + - NR + - NP + - NL + - NC + - NZ + - NI + - NE + - NG + - NU + - NF + - KP + - MK + - MP + - 'NO' + - OM + - PK + - PW + - PS + - PA + - PG + - PY + - PE + - PH + - PN + - PL + - PT + - PR + - QA + - RE + - RO + - RU + - RW + - BL + - SH + - KN + - LC + - MF + - PM + - VC + - WS + - SM + - ST + - SA + - SN + - RS + - SC + - SL + - SG + - SX + - SK + - SI + - SB + - SO + - ZA + - GS + - KR + - SS + - ES + - LK + - SD + - SR + - SJ + - SE + - CH + - SY + - TW + - TJ + - TZ + - TH + - TL + - TG + - TK + - TO + - TT + - TN + - TR + - TM + - TC + - TV + - UG + - UA + - AE + - GB + - UM + - US + - UY + - UZ + - VU + - VE + - VN + - VG + - VI + - WF + - EH + - YE + - ZM + - ZW + type: string + region_continent: + enum: + - North America + - Asia Pacific + - Europe + - South America + - Africa + - Australia + - Middle East + type: string + media: + enum: + - Ethernet + - ATM + - Multiple + type: string + notes: + type: string + proto_unicast: + type: string + readOnly: true + proto_multicast: + type: boolean + readOnly: true + proto_ipv6: + type: string + readOnly: true + website: + type: string + format: uri + pattern: "^(?:[a-z0-9.+-]*)://(?:[^\\s:@/]+(?::[^\\s:@/]*)?@)?(?:(?:0|25[0-5]|2[0-4]\\\ + d|1\\d?\\d?|[1-9]\\d?)(?:\\.(?:0|25[0-5]|2[0-4]\\d|1\\d?\\d?|[1-9]\\\ + d?)){3}|\\[[0-9a-f:.]+\\]|([a-z\xA1-\uFFFF0-9](?:[a-z\xA1-\uFFFF\ + 0-9-]{0,61}[a-z\xA1-\uFFFF0-9])?(?:\\.(?!-)[a-z\xA1-\uFFFF0-9-]{1,63}(?__lt=10\n ?__in=1,10\n\n### String Queries\n\ - \nOn string fields you can suffix the field names with the following filters:\n\ - \n- \\_\\_contains : field value contains specified value\n- \\_\\_startswith\ - \ : field value starts with specified value\n- \\_\\_in : value contained\ - \ inside set of values (comma separated)\n\n**examples**\n\n ?__contains=something\n\ - \ ?__in=this,that\n\nAll string filtering operations are case-insensitive\n\ - \n### Since\n\n\nYou can use the since argument with a unix timestamp (seconds)\ - \ to retrieve all\nobjects updated since then. Note that this result will\ - \ contain objects that were\ndeleted in that timeframe as well - you can spot\ - \ them by checking for status \"deleted\"\n\n**example**\n\n ?since=1443414678\n\ - \n### Nested data\n\nAny field ending in the suffix **_set** is a list of\ - \ objects in a relationship with the parent\nobject, you can expand those\ - \ lists with the 'depth' parameter as explained below.\n\nThe naming schema\ - \ of the field will always tell you which type of object the set is holding\n\ - and will correspond with the object's endpoint on the API\n\n _set\n\ - \nSo a set called 'net_set' will hold Network objects (api endpoint /net)\n\ - \n### Depth\n\nNested sets will not be loaded (any field ending with the _set\ - \ suffix) unless the 'depth'\nparameter is passed in the request URL.\n\n\ - Depth can be one of three values:\n\n - 1 : expand sets into ids (slow)\n\ - \ - 2 : expand sets into objects (slower)\n - 0 : dont expand sets at all\ - \ (default behaviour)\n\n**example**\n\n ?depth=1\n\n### Cached Responses\n\ - \nAny request that does not require lookups will be served a cached result.\ - \ Cache is updated approximately every 15 minutes.\n\nYou can spot cached\ - \ responses by checking for the \"generated\" property inside the \"meta\"\ - \ object.\n\n \"meta\" : {\n // the cached data was last regenerated\ - \ at this time (epoch)\n \"generated\" : 1456121358.6301942\n }\n\ - \n**examples**\n\nwill serve a cached result:\n\n ?depth=2\n\nwill serve\ - \ a live result:\n\n ?id__in=1,2\n\n### Resultset limit\n\nAny request\ - \ that does lookup queries and has it's **depth** parameter specified will\ - \ have a result limit of 250 entries, any entries past this limit will be\ - \ truncated, at which point you either should be more specific with your query\ - \ or use the skip and limit parameters to page through the result set\n\n\ - **examples**\n\nwill serve a live result and a maximum of 250 rows at a time:\n\ - \n ?updated__gt=2011-01-01&depth=1\n\nwill serve a live result and will\ - \ not be truncated:\n\n ?updated__gt=2011-01-01\n\nwill serve a cached\ - \ result and will not be truncated:\n\n ?depth=1\n\n### Pagination\n\n\ - Use the skip and limit parameters to page through results\n\n ?updated__gt=2011-01-01&depth=1&limit=250\ - \ - first page\n ?updated__gt=2011-01-01&depth=1&limit=250&skip=250 - second\ - \ page\n ?updated__gt=2011-01-01&depth=1&limit=250&skip=500 - third page\n" - parameters: [] - responses: - '200': - content: - application/json: - schema: - type: array - items: - properties: {} - description: '' - /api/as_set/{asn}: - get: - operationId: retrieve - description: "AS-SET endpoint\n\nlists all as sets mapped by asn\n\n## List\ - \ objects\n\n### Querying\n\nYou may query the resultset by passing field\ - \ names as url parameters\n\n### Numeric Queries\n\nOn numeric fields you\ - \ can suffix the field names with the following filters:\n\n- \\_\\_lt : less-than\n\ - - \\_\\_lte : less-than-equal\n- \\_\\_gt : greater-than\n- \\_\\_gte : greater-than-equal\n\ - - \\_\\_in : value inside set of values (comma separated)\n\n**examples**\n\ - \n ?__lt=10\n ?__in=1,10\n\n### String Queries\n\ - \nOn string fields you can suffix the field names with the following filters:\n\ - \n- \\_\\_contains : field value contains specified value\n- \\_\\_startswith\ - \ : field value starts with specified value\n- \\_\\_in : value contained\ - \ inside set of values (comma separated)\n\n**examples**\n\n ?__contains=something\n\ - \ ?__in=this,that\n\nAll string filtering operations are case-insensitive\n\ - \n### Since\n\n\nYou can use the since argument with a unix timestamp (seconds)\ - \ to retrieve all\nobjects updated since then. Note that this result will\ - \ contain objects that were\ndeleted in that timeframe as well - you can spot\ - \ them by checking for status \"deleted\"\n\n**example**\n\n ?since=1443414678\n\ - \n### Nested data\n\nAny field ending in the suffix **_set** is a list of\ - \ objects in a relationship with the parent\nobject, you can expand those\ - \ lists with the 'depth' parameter as explained below.\n\nThe naming schema\ - \ of the field will always tell you which type of object the set is holding\n\ - and will correspond with the object's endpoint on the API\n\n _set\n\ - \nSo a set called 'net_set' will hold Network objects (api endpoint /net)\n\ - \n### Depth\n\nNested sets will not be loaded (any field ending with the _set\ - \ suffix) unless the 'depth'\nparameter is passed in the request URL.\n\n\ - Depth can be one of three values:\n\n - 1 : expand sets into ids (slow)\n\ - \ - 2 : expand sets into objects (slower)\n - 0 : dont expand sets at all\ - \ (default behaviour)\n\n**example**\n\n ?depth=1\n\n### Cached Responses\n\ - \nAny request that does not require lookups will be served a cached result.\ - \ Cache is updated approximately every 15 minutes.\n\nYou can spot cached\ - \ responses by checking for the \"generated\" property inside the \"meta\"\ - \ object.\n\n \"meta\" : {\n // the cached data was last regenerated\ - \ at this time (epoch)\n \"generated\" : 1456121358.6301942\n }\n\ - \n**examples**\n\nwill serve a cached result:\n\n ?depth=2\n\nwill serve\ - \ a live result:\n\n ?id__in=1,2\n\n### Resultset limit\n\nAny request\ - \ that does lookup queries and has it's **depth** parameter specified will\ - \ have a result limit of 250 entries, any entries past this limit will be\ - \ truncated, at which point you either should be more specific with your query\ - \ or use the skip and limit parameters to page through the result set\n\n\ - **examples**\n\nwill serve a live result and a maximum of 250 rows at a time:\n\ - \n ?updated__gt=2011-01-01&depth=1\n\nwill serve a live result and will\ - \ not be truncated:\n\n ?updated__gt=2011-01-01\n\nwill serve a cached\ - \ result and will not be truncated:\n\n ?depth=1\n\n### Pagination\n\n\ - Use the skip and limit parameters to page through results\n\n ?updated__gt=2011-01-01&depth=1&limit=250\ - \ - first page\n ?updated__gt=2011-01-01&depth=1&limit=250&skip=250 - second\ - \ page\n ?updated__gt=2011-01-01&depth=1&limit=250&skip=500 - third page\n" - parameters: - - name: asn - in: path - required: true - description: '' - schema: + state: type: string - responses: - '200': - content: - application/json: - schema: - properties: {} - description: '' + maxLength: 255 + zipcode: + type: string + maxLength: 48 + floor: + type: string + maxLength: 255 + suite: + type: string + maxLength: 255 + latitude: + type: number + readOnly: true + longitude: + type: number + readOnly: true + created: + type: string + format: date-time + readOnly: true + updated: + type: string + format: date-time + readOnly: true + status: + type: string + maxLength: 255 + required: + - name + ASSet: + type: object + properties: {} diff --git a/peeringdb_server/static/peeringdb.js b/peeringdb_server/static/peeringdb.js index e9dce824..352bd8e1 100644 --- a/peeringdb_server/static/peeringdb.js +++ b/peeringdb_server/static/peeringdb.js @@ -117,6 +117,17 @@ PeeringDB = { }, + focus: function() { + // autofocus fields + var path = window.location.pathname; + if (path == '/') { + $("#search").focus(); + } + else if (path == '/advanced_search') { + $(".tab-pane.active").find("input.editable")[0].focus() + } + }, + // fix list x offsets depending on whether content is overflowing // or not - as it gets pushed over by scrollbars fix_list_offsets : function() { @@ -517,7 +528,7 @@ PeeringDB.IXFProposals = twentyc.cls.define( ixf_proposals.sync_proposals_state(proposals); - // write proposals + // wire proposals proposals.find('.row.item').each(function() { var row = $(this) var button_add = row.find('button.add'); @@ -1941,9 +1952,9 @@ twentyc.editable.target.register( me.trigger("success", {}); } ).done(function(r) { - if (r.meta && r.meta.geovalidation_warning){ + if (r && r.meta && r.meta.geovalidation_warning){ PeeringDB.add_geo_warning(r.meta, endpoint); - } else if (r.meta && r.meta.suggested_address){ + } else if (r && r.meta && r.meta.suggested_address){ PeeringDB.add_suggested_address(r, endpoint); } }).fail(function(r) { @@ -2210,6 +2221,28 @@ twentyc.editable.module.register( }); }); + // clean up IX-F proposals for ADD suggestions where + // ipaddresses matches either of the ipaddresses of the newly + // added netixlan - see #807 + + if(data.ipaddr4 != "") { + let ixf_prop_ip4 = $('.suggestions-add').find('input[value="'+data.ipaddr4+'"]'); + let par = ixf_prop_ip4.parents(".item") + ixf_prop_ip4.val("") + if(par.find('input[data-field="ipaddr6"]').val() == "") { + PeeringDB.ixf_proposals.detach_row(par); + } + } + + if(data.ipaddr6 != "") { + let ixf_prop_ip6 = $('.suggestions-add').find('input[value="'+data.ipaddr6+'"]'); + let par = ixf_prop_ip6.parents(".item") + ixf_prop_ip6.val("") + if(par.find('input[data-field="ipaddr4"]').val() == "") { + PeeringDB.ixf_proposals.detach_row(par); + } + } + }, finalize_update_netixlan : function(rowId, row, data) { @@ -3295,3 +3328,14 @@ $(twentyc.data).on("load-enum/traffic", function(e, payload) { $(window).bind("load", function() { PeeringDB.init(); }) + +$(window).bind("pageshow", function() { + PeeringDB.focus(); + $('a[data-toggle="tab"]').on('shown.bs.tab', function (e) { + PeeringDB.focus() + }); +}) + + + + diff --git a/peeringdb_server/static/site.css b/peeringdb_server/static/site.css index ca350c11..d03fd97a 100644 --- a/peeringdb_server/static/site.css +++ b/peeringdb_server/static/site.css @@ -414,8 +414,14 @@ div.panel > .btn { display: inline-block; } +.editable-inline { + display: inline-block; +} + .mode-edit .netixlan-extra { - margin-top: 10px; + color: #000 !important; + display: inline-block; + white-space: nowrap; } .glyphicon-warning-sign { @@ -840,6 +846,11 @@ div.list div.row.item img { width: 15px; } +div.list div.squeeze-15 { + padding-left: 15px; + padding-right: 15px; +} + *[data-sort-target] { cursor: pointer; } diff --git a/peeringdb_server/templates/email/notify-org-admin-flagged.txt b/peeringdb_server/templates/email/notify-org-admin-flagged.txt new file mode 100644 index 00000000..10516fd0 --- /dev/null +++ b/peeringdb_server/templates/email/notify-org-admin-flagged.txt @@ -0,0 +1,10 @@ +{% load i18n %} +{% blocktrans with org_name=org.name org_url=org.view_url duration=duration %} +You have been sent this message because you are an administrator for {{ org_name }}. + +{{ org_name }} does not currently have any active facilities, exchanges or networks in it. + +If it remains empty for {{ duration }} days it will be removed. + +You can add objects to your organization here: {{ org_url }} +{% endblocktrans %} diff --git a/peeringdb_server/templates/site/stats.html b/peeringdb_server/templates/site/stats.html index af58533d..ac52b97a 100644 --- a/peeringdb_server/templates/site/stats.html +++ b/peeringdb_server/templates/site/stats.html @@ -46,4 +46,4 @@ {% endif %} - + \ No newline at end of file diff --git a/peeringdb_server/templates/site/view.html b/peeringdb_server/templates/site/view.html index 671e2fb7..16627318 100644 --- a/peeringdb_server/templates/site/view.html +++ b/peeringdb_server/templates/site/view.html @@ -62,7 +62,7 @@
-
+
{% if permissions.can_edit %} -
+
{% include side_template_name with data=data instance=instance permissions=permissions %}
diff --git a/peeringdb_server/templates/site/view_exchange_side.html b/peeringdb_server/templates/site/view_exchange_side.html index e8840f0f..efc763a7 100644 --- a/peeringdb_server/templates/site/view_exchange_side.html +++ b/peeringdb_server/templates/site/view_exchange_side.html @@ -13,16 +13,19 @@
-
-
{% trans "Peer Name" %}
-
{% trans "ASN" %}
-
+
{% trans "Peer Name" %}
{% trans "IPv4" %}
-
{% trans "IPv6" %}
+
+
{% trans "ASN" %}
+
{% trans "IPv6" %}
+
+
{% trans "Speed" %}
+
+
{% trans "Policy" %}
@@ -43,23 +46,28 @@ {% for x in data.networks %}
-
+
- -
{{ x.asn }}
-
-
-
{{ x.ipaddr4|none_blank }}
-
{{ x.ipaddr6|none_blank }}
+
{{ x.asn }}
+
+
{{ x.speed|pretty_speed }}
+
+
{{ x.network.policy_general }}
+
+
{{ x.ipaddr4|none_blank }}
+
+
+
{{ x.ipaddr6|none_blank }}
+
{% endfor %} diff --git a/peeringdb_server/templates/site/view_network_assets.html b/peeringdb_server/templates/site/view_network_assets.html index ed2e3f64..bdc1d5c4 100644 --- a/peeringdb_server/templates/site/view_network_assets.html +++ b/peeringdb_server/templates/site/view_network_assets.html @@ -4,25 +4,29 @@
-
- {% if permissions.can_delete %} - × - {% endif %} -
+
+
+ {% if permissions.can_delete %} + × + {% endif %} +
+
+ + +
- - +
+
+
-
-
{% trans "Operational" %}
+
+
+
+
+
+
+
+
+
-
-
+
+
+
+
-
-
-
-
-
+
+
+
-
-
-
diff --git a/peeringdb_server/templates/site/view_network_side.html b/peeringdb_server/templates/site/view_network_side.html index 70225fc6..7be98949 100644 --- a/peeringdb_server/templates/site/view_network_side.html +++ b/peeringdb_server/templates/site/view_network_side.html @@ -6,7 +6,7 @@
-
+
{% trans "Exchange" %}
-
{% trans "ASN" %}
-
-
{% trans "IPv4" %}
+
+
+
{% trans "ASN" %}
{% trans "IPv6" %}
-
+
{% trans "Speed" %}
-
{% trans "RS Peer" %}
+
+
+
{% trans "RS Peer" %}
@@ -51,18 +53,22 @@
{{ instance.id }}
{{ x.ixlan_id }}
-
- {% if permissions.can_delete %} - × - {% endif %} - +
- +
-
-
× + {% endif %} + + + {{ x.ixlan.ix.name }} + + + +
+
+
- {{ x.asn }} + {{ x.asn }} +
+
+
+
+ {% trans "Operational" %} +
-
+ + +
+ {{ x.speed|pretty_speed }} +
+
+ RS PEER
- {% trans "Operational" %} -
-
-
- {{ x.ipaddr4|none_blank }} -
-
- {{ x.ipaddr6|none_blank }} -
-
-
-
- {{ x.speed|pretty_speed }} -
-
- RS PEER -
+
+
+
+ {{ x.ipaddr4|none_blank }} +
+
+
+
+ {{ x.ipaddr6|none_blank }} +
+
@@ -201,9 +213,6 @@
- - -
{% trans "Add Exchange Point" %} diff --git a/peeringdb_server/templates/site/view_organization_tools.html b/peeringdb_server/templates/site/view_organization_tools.html index a9186836..3e17a832 100644 --- a/peeringdb_server/templates/site/view_organization_tools.html +++ b/peeringdb_server/templates/site/view_organization_tools.html @@ -165,7 +165,7 @@ data-edit-value="US">
- +
{% trans "CLLI Code" %}
@@ -561,6 +561,27 @@ data-edit-name="policy_phone">
+
+
{% trans "Sales E-mail" %}
+
+
+
+
+
+
+ {% trans "Sales Phone" %} + +
+
+
+
+
{% trans "Prefix" %}
diff --git a/peeringdb_server/views.py b/peeringdb_server/views.py index 13ef885b..6fb80fc2 100644 --- a/peeringdb_server/views.py +++ b/peeringdb_server/views.py @@ -1606,6 +1606,19 @@ def view_exchange(request, id): "value": data.get("policy_phone", dismiss), "help_text": field_help(InternetExchange, "policy_phone"), }, + { + "type": "email", + "name": "sales_email", + "label": _("Sales Email"), + "value": data.get("sales_email", dismiss), + }, + { + "type": "string", + "name": "sales_phone", + "label": _("Sales Phone"), + "value": data.get("sales_phone", dismiss), + "help_text": field_help(InternetExchange, "sales_phone"), + }, ], } @@ -1731,10 +1744,9 @@ def view_network(request, id): """ View network data for network specified by id. """ - try: network = NetworkSerializer.prefetch_related( - Network.objects, request, depth=2 + Network.objects, request, depth=2, selective=["poc_set"] ).get(id=id, status__in=["ok", "pending"]) except ObjectDoesNotExist: return view_http_error_404(request) @@ -2028,6 +2040,7 @@ def view_network(request, id): # Add POC data to dataset data["poc_set"] = network_d.get("poc_set") + # For tooltip data["phone_help_text"] = field_help(NetworkContact, "phone") diff --git a/poetry.lock b/poetry.lock index 8b7a3090..ce73b4c6 100644 --- a/poetry.lock +++ b/poetry.lock @@ -33,7 +33,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "backports.entry-points-selectable" -version = "1.1.0" +version = "1.1.1" description = "Compatibility shim providing selectable entry points for older implementations" category = "dev" optional = false @@ -41,7 +41,7 @@ python-versions = ">=2.7" [package.extras] docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "pytest-black (>=0.3.7)", "pytest-mypy", "pytest-checkdocs (>=2.4)", "pytest-enabler (>=1.0.1)"] +testing = ["pytest", "pytest-flake8", "pytest-cov", "pytest-black (>=0.3.7)", "pytest-mypy", "pytest-checkdocs (>=2.4)", "pytest-enabler (>=1.0.1)"] [[package]] name = "bcrypt" @@ -61,7 +61,7 @@ typecheck = ["mypy"] [[package]] name = "black" -version = "21.9b0" +version = "21.10b0" description = "The uncompromising code formatter." category = "dev" optional = false @@ -81,9 +81,9 @@ typing-extensions = [ [package.extras] colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.6.0)", "aiohttp-cors (>=0.4.0)"] +d = ["aiohttp (>=3.7.4)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] -python2 = ["typed-ast (>=1.4.2)"] +python2 = ["typed-ast (>=1.4.3)"] uvloop = ["uvloop (>=0.15.2)"] [[package]] @@ -194,7 +194,7 @@ jinja2 = "*" [[package]] name = "coverage" -version = "6.0.2" +version = "6.1.1" description = "Code coverage measurement for Python" category = "dev" optional = false @@ -273,7 +273,7 @@ python-versions = "*" [[package]] name = "django" -version = "3.2.8" +version = "3.2.9" description = "A high-level Python Web framework that encourages rapid development and clean, pragmatic design." category = "main" optional = false @@ -322,7 +322,7 @@ tags = ["django-taggit"] [[package]] name = "django-bootstrap3" -version = "15.0.0" +version = "21.1" description = "Bootstrap 3 support for Django projects" category = "main" optional = false @@ -386,7 +386,7 @@ sqlparse = ">=0.2.0" [[package]] name = "django-extensions" -version = "3.1.3" +version = "3.1.5" description = "Extensions for Django" category = "main" optional = false @@ -499,7 +499,7 @@ qrcode = ["qrcode"] [[package]] name = "django-peeringdb" -version = "2.10.0" +version = "2.11.0" description = "PeeringDB Django models" category = "main" optional = false @@ -560,7 +560,7 @@ simplejson = "*" [[package]] name = "django-reversion" -version = "4.0.0" +version = "4.0.1" description = "An extension to the Django web framework that provides version control for model instances." category = "main" optional = false @@ -713,7 +713,7 @@ python-versions = "*" [[package]] name = "filelock" -version = "3.3.0" +version = "3.3.2" description = "A platform independent file lock." category = "dev" optional = false @@ -779,7 +779,7 @@ python-versions = ">=3.6,<4.0" [[package]] name = "identify" -version = "2.3.0" +version = "2.3.5" description = "File identification library for Python" category = "dev" optional = false @@ -798,7 +798,7 @@ python-versions = ">=3.5" [[package]] name = "importlib-metadata" -version = "4.8.1" +version = "4.8.2" description = "Read metadata from Python packages" category = "dev" optional = false @@ -810,7 +810,7 @@ zipp = ">=0.5" [package.extras] docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] perf = ["ipython"] -testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] [[package]] name = "iniconfig" @@ -822,7 +822,7 @@ python-versions = "*" [[package]] name = "isort" -version = "5.9.3" +version = "5.10.1" description = "A Python utility / library to sort Python imports." category = "dev" optional = false @@ -1021,14 +1021,14 @@ coreapi = ">=2.2.0" [[package]] name = "packaging" -version = "21.0" +version = "21.2" description = "Core utilities for Python packages" category = "main" optional = false python-versions = ">=3.6" [package.dependencies] -pyparsing = ">=2.0.2" +pyparsing = ">=2.0.2,<3" [[package]] name = "paramiko" @@ -1087,7 +1087,7 @@ PyYAML = ">=3.11" [[package]] name = "phonenumbers" -version = "8.12.35" +version = "8.12.36" description = "Python version of Google's common library for parsing, formatting, storing and validating international phone numbers." category = "main" optional = false @@ -1095,7 +1095,7 @@ python-versions = "*" [[package]] name = "pillow" -version = "8.3.2" +version = "8.4.0" description = "Python Imaging Library (Fork)" category = "main" optional = false @@ -1143,11 +1143,11 @@ virtualenv = ">=20.0.8" [[package]] name = "py" -version = "1.10.0" +version = "1.11.0" description = "library with cross-python path, ini-parsing, io, code, log facilities" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "pycodestyle" @@ -1159,7 +1159,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "pycparser" -version = "2.20" +version = "2.21" description = "C parser in Python" category = "main" optional = false @@ -1186,7 +1186,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "pyjwt" -version = "2.2.0" +version = "2.3.0" description = "JSON Web Token implementation in Python" category = "main" optional = false @@ -1433,7 +1433,7 @@ munge = ">=1.0.0,<2.0.0" [[package]] name = "regex" -version = "2021.10.8" +version = "2021.11.2" description = "Alternative regular expression module, to replace re." category = "dev" optional = false @@ -1530,7 +1530,7 @@ python-versions = ">=2.7, <4" [[package]] name = "tokenize-rt" -version = "4.1.0" +version = "4.2.1" description = "A wrapper around the stdlib `tokenize` which roundtrips." category = "dev" optional = false @@ -1546,7 +1546,7 @@ python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" [[package]] name = "tomli" -version = "1.2.1" +version = "1.2.2" description = "A lil' TOML parser" category = "dev" optional = false @@ -1611,7 +1611,7 @@ python-versions = "*" [[package]] name = "virtualenv" -version = "20.8.1" +version = "20.10.0" description = "Virtual Python Environment builder" category = "dev" optional = false @@ -1620,12 +1620,12 @@ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" [package.dependencies] "backports.entry-points-selectable" = ">=1.0.4" distlib = ">=0.3.1,<1" -filelock = ">=3.0.0,<4" +filelock = ">=3.2,<4" platformdirs = ">=2,<3" six = ">=1.9.0,<2" [package.extras] -docs = ["proselint (>=0.10.2)", "sphinx (>=3)", "sphinx-argparse (>=0.2.5)", "sphinx-rtd-theme (>=0.4.3)", "towncrier (>=19.9.0rc1)"] +docs = ["proselint (>=0.10.2)", "sphinx (>=3)", "sphinx-argparse (>=0.2.5)", "sphinx-rtd-theme (>=0.4.3)", "towncrier (>=21.3)"] testing = ["coverage (>=4)", "coverage-enable-subprocess (>=1)", "flaky (>=3)", "pytest (>=4)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.1)", "pytest-mock (>=2)", "pytest-randomly (>=1)", "pytest-timeout (>=1)", "packaging (>=20.0)"] [[package]] @@ -1668,7 +1668,7 @@ python-versions = "*" [[package]] name = "wrapt" -version = "1.13.2" +version = "1.13.3" description = "Module for decorators, wrappers and monkey patching." category = "main" optional = false @@ -1689,7 +1689,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytes [metadata] lock-version = "1.1" python-versions = "^3.9" -content-hash = "8f4b584149e5de862d80d82f2a46760c2f66b382d91b5a395ba53762a3c13056" +content-hash = "15f58cf5775afd298ce11520b01f68d50b8d2ec94f0f1f4c43907ceb11479e8d" [metadata.files] asgiref = [ @@ -1705,8 +1705,8 @@ attrs = [ {file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"}, ] "backports.entry-points-selectable" = [ - {file = "backports.entry_points_selectable-1.1.0-py2.py3-none-any.whl", hash = "sha256:a6d9a871cde5e15b4c4a53e3d43ba890cc6861ec1332c9c2428c92f977192acc"}, - {file = "backports.entry_points_selectable-1.1.0.tar.gz", hash = "sha256:988468260ec1c196dab6ae1149260e2f5472c9110334e5d51adcb77867361f6a"}, + {file = "backports.entry_points_selectable-1.1.1-py2.py3-none-any.whl", hash = "sha256:7fceed9532a7aa2bd888654a7314f864a3c16a4e710b34a58cfc0f08114c663b"}, + {file = "backports.entry_points_selectable-1.1.1.tar.gz", hash = "sha256:914b21a479fde881635f7af5adc7f6e38d6b274be32269070c53b698c60d5386"}, ] bcrypt = [ {file = "bcrypt-3.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c95d4cbebffafcdd28bd28bb4e25b31c50f6da605c81ffd9ad8a3d1b2ab7b1b6"}, @@ -1718,8 +1718,8 @@ bcrypt = [ {file = "bcrypt-3.2.0.tar.gz", hash = "sha256:5b93c1726e50a93a033c36e5ca7fdcd29a5c7395af50a6892f5d9e7c6cfbfb29"}, ] black = [ - {file = "black-21.9b0-py3-none-any.whl", hash = "sha256:380f1b5da05e5a1429225676655dddb96f5ae8c75bdf91e53d798871b902a115"}, - {file = "black-21.9b0.tar.gz", hash = "sha256:7de4cfc7eb6b710de325712d40125689101d21d25283eed7e9998722cf10eb91"}, + {file = "black-21.10b0-py3-none-any.whl", hash = "sha256:6eb7448da9143ee65b856a5f3676b7dda98ad9abe0f87fce8c59291f15e82a5b"}, + {file = "black-21.10b0.tar.gz", hash = "sha256:a9952229092e325fe5f3dae56d81f639b23f7131eb840781947e4b2886030f33"}, ] bleach = [ {file = "bleach-4.1.0-py2.py3-none-any.whl", hash = "sha256:4d2651ab93271d1129ac9cbc679f524565cc8a1b791909c4a51eac4446a15994"}, @@ -1809,39 +1809,52 @@ coreschema = [ {file = "coreschema-0.0.4.tar.gz", hash = "sha256:9503506007d482ab0867ba14724b93c18a33b22b6d19fb419ef2d239dd4a1607"}, ] coverage = [ - {file = "coverage-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1549e1d08ce38259de2bc3e9a0d5f3642ff4a8f500ffc1b2df73fd621a6cdfc0"}, - {file = "coverage-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bcae10fccb27ca2a5f456bf64d84110a5a74144be3136a5e598f9d9fb48c0caa"}, - {file = "coverage-6.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:53a294dc53cfb39c74758edaa6305193fb4258a30b1f6af24b360a6c8bd0ffa7"}, - {file = "coverage-6.0.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8251b37be1f2cd9c0e5ccd9ae0380909c24d2a5ed2162a41fcdbafaf59a85ebd"}, - {file = "coverage-6.0.2-cp310-cp310-win32.whl", hash = "sha256:db42baa892cba723326284490283a68d4de516bfb5aaba369b4e3b2787a778b7"}, - {file = "coverage-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:bbffde2a68398682623d9dd8c0ca3f46fda074709b26fcf08ae7a4c431a6ab2d"}, - {file = "coverage-6.0.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:60e51a3dd55540bec686d7fff61b05048ca31e804c1f32cbb44533e6372d9cc3"}, - {file = "coverage-6.0.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a6a9409223a27d5ef3cca57dd7cd4dfcb64aadf2fad5c3b787830ac9223e01a"}, - {file = "coverage-6.0.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4b34ae4f51bbfa5f96b758b55a163d502be3dcb24f505d0227858c2b3f94f5b9"}, - {file = "coverage-6.0.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3bbda1b550e70fa6ac40533d3f23acd4f4e9cb4e6e77251ce77fdf41b3309fb2"}, - {file = "coverage-6.0.2-cp36-cp36m-win32.whl", hash = "sha256:4e28d2a195c533b58fc94a12826f4431726d8eb029ac21d874345f943530c122"}, - {file = "coverage-6.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:a82d79586a0a4f5fd1cf153e647464ced402938fbccb3ffc358c7babd4da1dd9"}, - {file = "coverage-6.0.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3be1206dc09fb6298de3fce70593e27436862331a85daee36270b6d0e1c251c4"}, - {file = "coverage-6.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9cd3828bbe1a40070c11fe16a51df733fd2f0cb0d745fb83b7b5c1f05967df7"}, - {file = "coverage-6.0.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d036dc1ed8e1388e995833c62325df3f996675779541f682677efc6af71e96cc"}, - {file = "coverage-6.0.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:04560539c19ec26995ecfb3d9307ff154fbb9a172cb57e3b3cfc4ced673103d1"}, - {file = "coverage-6.0.2-cp37-cp37m-win32.whl", hash = "sha256:e4fb7ced4d9dec77d6cf533acfbf8e1415fe799430366affb18d69ee8a3c6330"}, - {file = "coverage-6.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:77b1da5767ed2f44611bc9bc019bc93c03fa495728ec389759b6e9e5039ac6b1"}, - {file = "coverage-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:61b598cbdbaae22d9e34e3f675997194342f866bb1d781da5d0be54783dce1ff"}, - {file = "coverage-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36e9040a43d2017f2787b28d365a4bb33fcd792c7ff46a047a04094dc0e2a30d"}, - {file = "coverage-6.0.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9f1627e162e3864a596486774876415a7410021f4b67fd2d9efdf93ade681afc"}, - {file = "coverage-6.0.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e7a0b42db2a47ecb488cde14e0f6c7679a2c5a9f44814393b162ff6397fcdfbb"}, - {file = "coverage-6.0.2-cp38-cp38-win32.whl", hash = "sha256:a1b73c7c4d2a42b9d37dd43199c5711d91424ff3c6c22681bc132db4a4afec6f"}, - {file = "coverage-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:1db67c497688fd4ba85b373b37cc52c50d437fd7267520ecd77bddbd89ea22c9"}, - {file = "coverage-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f2f184bf38e74f152eed7f87e345b51f3ab0b703842f447c22efe35e59942c24"}, - {file = "coverage-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd1cf1deb3d5544bd942356364a2fdc8959bad2b6cf6eb17f47d301ea34ae822"}, - {file = "coverage-6.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ad9b8c1206ae41d46ec7380b78ba735ebb77758a650643e841dd3894966c31d0"}, - {file = "coverage-6.0.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:381d773d896cc7f8ba4ff3b92dee4ed740fb88dfe33b6e42efc5e8ab6dfa1cfe"}, - {file = "coverage-6.0.2-cp39-cp39-win32.whl", hash = "sha256:424c44f65e8be58b54e2b0bd1515e434b940679624b1b72726147cfc6a9fc7ce"}, - {file = "coverage-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:abbff240f77347d17306d3201e14431519bf64495648ca5a49571f988f88dee9"}, - {file = "coverage-6.0.2-pp36-none-any.whl", hash = "sha256:7092eab374346121805fb637572483270324407bf150c30a3b161fc0c4ca5164"}, - {file = "coverage-6.0.2-pp37-none-any.whl", hash = "sha256:30922626ce6f7a5a30bdba984ad21021529d3d05a68b4f71ea3b16bda35b8895"}, - {file = "coverage-6.0.2.tar.gz", hash = "sha256:6807947a09510dc31fa86f43595bf3a14017cd60bf633cc746d52141bfa6b149"}, + {file = "coverage-6.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:42a1fb5dee3355df90b635906bb99126faa7936d87dfc97eacc5293397618cb7"}, + {file = "coverage-6.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a00284dbfb53b42e35c7dd99fc0e26ef89b4a34efff68078ed29d03ccb28402a"}, + {file = "coverage-6.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:51a441011a30d693e71dea198b2a6f53ba029afc39f8e2aeb5b77245c1b282ef"}, + {file = "coverage-6.1.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e76f017b6d4140a038c5ff12be1581183d7874e41f1c0af58ecf07748d36a336"}, + {file = "coverage-6.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7833c872718dc913f18e51ee97ea0dece61d9930893a58b20b3daf09bb1af6b6"}, + {file = "coverage-6.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8186b5a4730c896cbe1e4b645bdc524e62d874351ae50e1db7c3e9f5dc81dc26"}, + {file = "coverage-6.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bbca34dca5a2d60f81326d908d77313816fad23d11b6069031a3d6b8c97a54f9"}, + {file = "coverage-6.1.1-cp310-cp310-win32.whl", hash = "sha256:72bf437d54186d104388cbae73c9f2b0f8a3e11b6e8d7deb593bd14625c96026"}, + {file = "coverage-6.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:994ce5a7b3d20981b81d83618aa4882f955bfa573efdbef033d5632b58597ba9"}, + {file = "coverage-6.1.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:ab6a0fe4c96f8058d41948ddf134420d3ef8c42d5508b5a341a440cce7a37a1d"}, + {file = "coverage-6.1.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10ab138b153e4cc408b43792cb7f518f9ee02f4ff55cd1ab67ad6fd7e9905c7e"}, + {file = "coverage-6.1.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:7e083d32965d2eb6638a77e65b622be32a094fdc0250f28ce6039b0732fbcaa8"}, + {file = "coverage-6.1.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:359a32515e94e398a5c0fa057e5887a42e647a9502d8e41165cf5cb8d3d1ca67"}, + {file = "coverage-6.1.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:bf656cd74ff7b4ed7006cdb2a6728150aaad69c7242b42a2a532f77b63ea233f"}, + {file = "coverage-6.1.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:dc5023be1c2a8b0a0ab5e31389e62c28b2453eb31dd069f4b8d1a0f9814d951a"}, + {file = "coverage-6.1.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:557594a50bfe3fb0b1b57460f6789affe8850ad19c1acf2d14a3e12b2757d489"}, + {file = "coverage-6.1.1-cp36-cp36m-win32.whl", hash = "sha256:9eb0a1923354e0fdd1c8a6f53f5db2e6180d670e2b587914bf2e79fa8acfd003"}, + {file = "coverage-6.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:04a92a6cf9afd99f9979c61348ec79725a9f9342fb45e63c889e33c04610d97b"}, + {file = "coverage-6.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:479228e1b798d3c246ac89b09897ee706c51b3e5f8f8d778067f38db73ccc717"}, + {file = "coverage-6.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78287731e3601ea5ce9d6468c82d88a12ef8fe625d6b7bdec9b45d96c1ad6533"}, + {file = "coverage-6.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c95257aa2ccf75d3d91d772060538d5fea7f625e48157f8ca44594f94d41cb33"}, + {file = "coverage-6.1.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9ad5895938a894c368d49d8470fe9f519909e5ebc6b8f8ea5190bd0df6aa4271"}, + {file = "coverage-6.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:326d944aad0189603733d646e8d4a7d952f7145684da973c463ec2eefe1387c2"}, + {file = "coverage-6.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:e7d5606b9240ed4def9cbdf35be4308047d11e858b9c88a6c26974758d6225ce"}, + {file = "coverage-6.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:572f917267f363101eec375c109c9c1118037c7cc98041440b5eabda3185ac7b"}, + {file = "coverage-6.1.1-cp37-cp37m-win32.whl", hash = "sha256:35cd2230e1ed76df7d0081a997f0fe705be1f7d8696264eb508076e0d0b5a685"}, + {file = "coverage-6.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:65ad3ff837c89a229d626b8004f0ee32110f9bfdb6a88b76a80df36ccc60d926"}, + {file = "coverage-6.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:977ce557d79577a3dd510844904d5d968bfef9489f512be65e2882e1c6eed7d8"}, + {file = "coverage-6.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62512c0ec5d307f56d86504c58eace11c1bc2afcdf44e3ff20de8ca427ca1d0e"}, + {file = "coverage-6.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2e5b9c17a56b8bf0c0a9477fcd30d357deb486e4e1b389ed154f608f18556c8a"}, + {file = "coverage-6.1.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:666c6b32b69e56221ad1551d377f718ed00e6167c7a1b9257f780b105a101271"}, + {file = "coverage-6.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:fb2fa2f6506c03c48ca42e3fe5a692d7470d290c047ee6de7c0f3e5fa7639ac9"}, + {file = "coverage-6.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:f0f80e323a17af63eac6a9db0c9188c10f1fd815c3ab299727150cc0eb92c7a4"}, + {file = "coverage-6.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:738e823a746841248b56f0f3bd6abf3b73af191d1fd65e4c723b9c456216f0ad"}, + {file = "coverage-6.1.1-cp38-cp38-win32.whl", hash = "sha256:8605add58e6a960729aa40c0fd9a20a55909dd9b586d3e8104cc7f45869e4c6b"}, + {file = "coverage-6.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:6e994003e719458420e14ffb43c08f4c14990e20d9e077cb5cad7a3e419bbb54"}, + {file = "coverage-6.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e3c4f5211394cd0bf6874ac5d29684a495f9c374919833dcfff0bd6d37f96201"}, + {file = "coverage-6.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e14bceb1f3ae8a14374be2b2d7bc12a59226872285f91d66d301e5f41705d4d6"}, + {file = "coverage-6.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0147f7833c41927d84f5af9219d9b32f875c0689e5e74ac8ca3cb61e73a698f9"}, + {file = "coverage-6.1.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b1d0a1bce919de0dd8da5cff4e616b2d9e6ebf3bd1410ff645318c3dd615010a"}, + {file = "coverage-6.1.1-cp39-cp39-win32.whl", hash = "sha256:a11a2c019324fc111485e79d55907e7289e53d0031275a6c8daed30690bc50c0"}, + {file = "coverage-6.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:4d8b453764b9b26b0dd2afb83086a7c3f9379134e340288d2a52f8a91592394b"}, + {file = "coverage-6.1.1-pp36-none-any.whl", hash = "sha256:3b270c6b48d3ff5a35deb3648028ba2643ad8434b07836782b1139cf9c66313f"}, + {file = "coverage-6.1.1-pp37-none-any.whl", hash = "sha256:ffa8fee2b1b9e60b531c4c27cf528d6b5d5da46b1730db1f4d6eee56ff282e07"}, + {file = "coverage-6.1.1-pp38-none-any.whl", hash = "sha256:4cd919057636f63ab299ccb86ea0e78b87812400c76abab245ca385f17d19fb5"}, + {file = "coverage-6.1.1.tar.gz", hash = "sha256:b8e4f15b672c9156c1154249a9c5746e86ac9ae9edc3799ee3afebc323d9d9e0"}, ] cryptography = [ {file = "cryptography-35.0.0-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:d57e0cdc1b44b6cdf8af1d01807db06886f10177469312fbde8f44ccbb284bc9"}, @@ -1886,8 +1899,8 @@ distro = [ {file = "distro-1.6.0.tar.gz", hash = "sha256:83f5e5a09f9c5f68f60173de572930effbcc0287bb84fdc4426cb4168c088424"}, ] django = [ - {file = "Django-3.2.8-py3-none-any.whl", hash = "sha256:42573831292029639b798fe4d3812996bfe4ff3275f04566da90764daec011a5"}, - {file = "Django-3.2.8.tar.gz", hash = "sha256:f6d2c4069c9b9bfac03bedff927ea1f9e0d29e34525cec8a68fd28eb2a8df7af"}, + {file = "Django-3.2.9-py3-none-any.whl", hash = "sha256:e22c9266da3eec7827737cde57694d7db801fedac938d252bf27377cec06ed1b"}, + {file = "Django-3.2.9.tar.gz", hash = "sha256:51284300f1522ffcdb07ccbdf676a307c6678659e1284f0618e5a774127a6a08"}, ] django-allauth = [ {file = "django-allauth-0.45.0.tar.gz", hash = "sha256:6d46be0e1480316ccd45476db3aefb39db70e038d2a543112d314b76bb999a4e"}, @@ -1896,8 +1909,8 @@ django-autocomplete-light = [ {file = "django-autocomplete-light-3.8.2.tar.gz", hash = "sha256:25f0ea71b59a8f1f97a8a564e33e429570b0ea77c5eac81f7beb283073b4ba90"}, ] django-bootstrap3 = [ - {file = "django-bootstrap3-15.0.0.tar.gz", hash = "sha256:f803efd5605046b8f467523dbe94653a4a8d6bcf97ad480b386ba5cf8f94fe6b"}, - {file = "django_bootstrap3-15.0.0-py3-none-any.whl", hash = "sha256:601c918a466e6a702f7b394a94826ba9f53c9cc879ccfc26579e3473eef80f53"}, + {file = "django-bootstrap3-21.1.tar.gz", hash = "sha256:e63ee3392b1a78e4ccf493397f131f767f675ddc0eaba1e37b258adb18683d5f"}, + {file = "django_bootstrap3-21.1-py3-none-any.whl", hash = "sha256:20e80c0e528f3b68e48025b7f37a306b7f2499a92718f6e676a03e66fe46624c"}, ] django-cors-headers = [ {file = "django-cors-headers-3.10.0.tar.gz", hash = "sha256:cd6f4360f5246569c149dc1c40c907c191f1ec45551e10d2a2e2e68512652f78"}, @@ -1920,8 +1933,8 @@ django-debug-toolbar = [ {file = "django_debug_toolbar-3.2.2-py3-none-any.whl", hash = "sha256:d7bab7573fab35b0fd029163371b7182f5826c13da69734beb675c761d06a4d3"}, ] django-extensions = [ - {file = "django-extensions-3.1.3.tar.gz", hash = "sha256:5f0fea7bf131ca303090352577a9e7f8bfbf5489bd9d9c8aea9401db28db34a0"}, - {file = "django_extensions-3.1.3-py3-none-any.whl", hash = "sha256:50de8977794a66a91575dd40f87d5053608f679561731845edbd325ceeb387e3"}, + {file = "django-extensions-3.1.5.tar.gz", hash = "sha256:28e1e1bf49f0e00307ba574d645b0af3564c981a6dfc87209d48cb98f77d0b1a"}, + {file = "django_extensions-3.1.5-py3-none-any.whl", hash = "sha256:9238b9e016bb0009d621e05cf56ea8ce5cce9b32e91ad2026996a7377ca28069"}, ] django-formtools = [ {file = "django-formtools-2.3.tar.gz", hash = "sha256:9663b6eca64777b68d6d4142efad8597fe9a685924673b25aa8a1dcff4db00c3"}, @@ -1959,8 +1972,8 @@ django-otp = [ {file = "django_otp-1.1.1-py3-none-any.whl", hash = "sha256:0c03a471db9e876f3671314bc9a65bd56a5c3c108ee0562c473701310bba4a77"}, ] django-peeringdb = [ - {file = "django-peeringdb-2.10.0.tar.gz", hash = "sha256:8f5f237f4bd6c9f5c5837dabc5d6c7be5598e55f1a81797a2ac2da735ce19a10"}, - {file = "django_peeringdb-2.10.0-py3-none-any.whl", hash = "sha256:4defbb5d78a3e57268c7cc8a5e66130c4f761503e5ea3c8c368a27dd5e57250e"}, + {file = "django-peeringdb-2.11.0.tar.gz", hash = "sha256:d27ca54f8db12808f227820b3b986b1edf23eb5670dfa64af94201307c4ca065"}, + {file = "django_peeringdb-2.11.0-py3-none-any.whl", hash = "sha256:fc35b72d2cf27c7bd53fb3d0f555150a94d8386279e832c10c8a576272bc684e"}, ] django-phonenumber-field = [ {file = "django-phonenumber-field-5.2.0.tar.gz", hash = "sha256:52b2e5970133ec5ab701218b802f7ab237229854dc95fd239b7e9e77dc43731d"}, @@ -1978,8 +1991,8 @@ django-rest-swagger = [ {file = "django_rest_swagger-2.2.0-py2.py3-none-any.whl", hash = "sha256:b039b0288bab4665cd45dc5d16f94b13911bc4ad0ed55f74ad3b90aa31c87c17"}, ] django-reversion = [ - {file = "django-reversion-4.0.0.tar.gz", hash = "sha256:ad6d714b4b9b824e22b88d47201cc0f74b5c4294c8d4e1f8d7ac7c3631ef3188"}, - {file = "django_reversion-4.0.0-py3-none-any.whl", hash = "sha256:f059c654e38c0dd8dccd7f0990aa2f6d9ad22dab55c5e095f9596aeda8079dcd"}, + {file = "django-reversion-4.0.1.tar.gz", hash = "sha256:6991f16e5d3a972912db3d56e3a714d10b07becd566ab87f85f2e9b671981339"}, + {file = "django_reversion-4.0.1-py3-none-any.whl", hash = "sha256:2e40ed41e08cdd83a05dc70a1974feface52a61ba7d289727117163052081ae6"}, ] django-simple-captcha = [ {file = "django-simple-captcha-0.5.14.zip", hash = "sha256:84b5c188e6ae50e9ecec5e5d734c5bc4d2a50fbbca7f59d2c12da9a3bbee5051"}, @@ -2020,8 +2033,8 @@ docopt = [ {file = "docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491"}, ] filelock = [ - {file = "filelock-3.3.0-py3-none-any.whl", hash = "sha256:bbc6a0382fe8ec4744ecdf6683a2e07f65eb10ff1aff53fc02a202565446cde0"}, - {file = "filelock-3.3.0.tar.gz", hash = "sha256:8c7eab13dc442dc249e95158bcc12dec724465919bdc9831fdbf0660f03d1785"}, + {file = "filelock-3.3.2-py3-none-any.whl", hash = "sha256:bb2a1c717df74c48a2d00ed625e5a66f8572a3a30baacb7657add1d7bac4097b"}, + {file = "filelock-3.3.2.tar.gz", hash = "sha256:7afc856f74fa7006a289fd10fa840e1eebd8bbff6bffb69c26c54a0512ea8cf8"}, ] flake8 = [ {file = "flake8-3.9.2-py2.py3-none-any.whl", hash = "sha256:bf8fd333346d844f616e8d47905ef3a3384edae6b4e9beb0c5101e25e3110907"}, @@ -2041,24 +2054,24 @@ grainy = [ {file = "grainy-1.8.1.tar.gz", hash = "sha256:2cfd8d50b3f5cce3c463f3c5e86324442f61a7cd46dfe7b134ee926559e56556"}, ] identify = [ - {file = "identify-2.3.0-py2.py3-none-any.whl", hash = "sha256:d1e82c83d063571bb88087676f81261a4eae913c492dafde184067c584bc7c05"}, - {file = "identify-2.3.0.tar.gz", hash = "sha256:fd08c97f23ceee72784081f1ce5125c8f53a02d3f2716dde79a6ab8f1039fea5"}, + {file = "identify-2.3.5-py2.py3-none-any.whl", hash = "sha256:ba945bddb4322394afcf3f703fa68eda08a6acc0f99d9573eb2be940aa7b9bba"}, + {file = "identify-2.3.5.tar.gz", hash = "sha256:6f0368ba0f21c199645a331beb7425d5374376e71bc149e9cb55e45cb45f832d"}, ] idna = [ {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, ] importlib-metadata = [ - {file = "importlib_metadata-4.8.1-py3-none-any.whl", hash = "sha256:b618b6d2d5ffa2f16add5697cf57a46c76a56229b0ed1c438322e4e95645bd15"}, - {file = "importlib_metadata-4.8.1.tar.gz", hash = "sha256:f284b3e11256ad1e5d03ab86bb2ccd6f5339688ff17a4d797a0fe7df326f23b1"}, + {file = "importlib_metadata-4.8.2-py3-none-any.whl", hash = "sha256:53ccfd5c134223e497627b9815d5030edf77d2ed573922f7a0b8f8bb81a1c100"}, + {file = "importlib_metadata-4.8.2.tar.gz", hash = "sha256:75bdec14c397f528724c1bfd9709d660b33a4d2e77387a3358f20b848bb5e5fb"}, ] iniconfig = [ {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, ] isort = [ - {file = "isort-5.9.3-py3-none-any.whl", hash = "sha256:e17d6e2b81095c9db0a03a8025a957f334d6ea30b26f9ec70805411e5c7c81f2"}, - {file = "isort-5.9.3.tar.gz", hash = "sha256:9c2ea1e62d871267b78307fe511c0838ba0da28698c5732d54e2790bf3ba9899"}, + {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, + {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, ] itypes = [ {file = "itypes-1.2.0-py2.py3-none-any.whl", hash = "sha256:03da6872ca89d29aef62773672b2d408f490f80db48b23079a4b194c86dd04c6"}, @@ -2158,8 +2171,8 @@ openapi-codec = [ {file = "openapi-codec-1.3.2.tar.gz", hash = "sha256:1bce63289edf53c601ea3683120641407ff6b708803b8954c8a876fe778d2145"}, ] packaging = [ - {file = "packaging-21.0-py3-none-any.whl", hash = "sha256:c86254f9220d55e31cc94d69bade760f0847da8000def4dfe1c6b872fd14ff14"}, - {file = "packaging-21.0.tar.gz", hash = "sha256:7dc96269f53a4ccec5c0670940a4281106dd0bb343f47b7471f779df49c2fbe7"}, + {file = "packaging-21.2-py3-none-any.whl", hash = "sha256:14317396d1e8cdb122989b916fa2c7e9ca8e2be9e8060a6eff75b6b7b4d8a7e0"}, + {file = "packaging-21.2.tar.gz", hash = "sha256:096d689d78ca690e4cd8a89568ba06d07ca097e3306a4381635073ca91479966"}, ] paramiko = [ {file = "paramiko-2.8.0-py2.py3-none-any.whl", hash = "sha256:def3ec612399bab4e9f5eb66b0ae5983980db9dd9120d9e9c6ea3ff673865d1c"}, @@ -2177,63 +2190,51 @@ peeringdb = [ {file = "peeringdb-1.1.0.tar.gz", hash = "sha256:927a34c31e5b93130a855bb4c8fd84dcf604b9939678f75918f7c1bd8a501471"}, ] phonenumbers = [ - {file = "phonenumbers-8.12.35-py2.py3-none-any.whl", hash = "sha256:16c8f6d682ab5be550af2f4a2f81f0a90c8743e37babc7465edcefc106d0a1eb"}, - {file = "phonenumbers-8.12.35.tar.gz", hash = "sha256:f426d419aabf6366c27ef1193918cc55217ef0e8be8f09cbf0667131037ca229"}, + {file = "phonenumbers-8.12.36-py2.py3-none-any.whl", hash = "sha256:fa91fff1cefee6873c78f08c767f341a7658c849ffb74b605cb38cefef0e76fa"}, + {file = "phonenumbers-8.12.36.tar.gz", hash = "sha256:e29717fcf86d68082fc6e42ca07e52bff863b6e0b354edd1644ba15c35ef213d"}, ] pillow = [ - {file = "Pillow-8.3.2-cp310-cp310-macosx_10_10_universal2.whl", hash = "sha256:c691b26283c3a31594683217d746f1dad59a7ae1d4cfc24626d7a064a11197d4"}, - {file = "Pillow-8.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f514c2717012859ccb349c97862568fdc0479aad85b0270d6b5a6509dbc142e2"}, - {file = "Pillow-8.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be25cb93442c6d2f8702c599b51184bd3ccd83adebd08886b682173e09ef0c3f"}, - {file = "Pillow-8.3.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d675a876b295afa114ca8bf42d7f86b5fb1298e1b6bb9a24405a3f6c8338811c"}, - {file = "Pillow-8.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59697568a0455764a094585b2551fd76bfd6b959c9f92d4bdec9d0e14616303a"}, - {file = "Pillow-8.3.2-cp310-cp310-win32.whl", hash = "sha256:2d5e9dc0bf1b5d9048a94c48d0813b6c96fccfa4ccf276d9c36308840f40c228"}, - {file = "Pillow-8.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:11c27e74bab423eb3c9232d97553111cc0be81b74b47165f07ebfdd29d825875"}, - {file = "Pillow-8.3.2-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:11eb7f98165d56042545c9e6db3ce394ed8b45089a67124298f0473b29cb60b2"}, - {file = "Pillow-8.3.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f23b2d3079522fdf3c09de6517f625f7a964f916c956527bed805ac043799b8"}, - {file = "Pillow-8.3.2-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19ec4cfe4b961edc249b0e04b5618666c23a83bc35842dea2bfd5dfa0157f81b"}, - {file = "Pillow-8.3.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5a31c07cea5edbaeb4bdba6f2b87db7d3dc0f446f379d907e51cc70ea375629"}, - {file = "Pillow-8.3.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:15ccb81a6ffc57ea0137f9f3ac2737ffa1d11f786244d719639df17476d399a7"}, - {file = "Pillow-8.3.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:8f284dc1695caf71a74f24993b7c7473d77bc760be45f776a2c2f4e04c170550"}, - {file = "Pillow-8.3.2-cp36-cp36m-win32.whl", hash = "sha256:4abc247b31a98f29e5224f2d31ef15f86a71f79c7f4d2ac345a5d551d6393073"}, - {file = "Pillow-8.3.2-cp36-cp36m-win_amd64.whl", hash = "sha256:a048dad5ed6ad1fad338c02c609b862dfaa921fcd065d747194a6805f91f2196"}, - {file = "Pillow-8.3.2-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:06d1adaa284696785375fa80a6a8eb309be722cf4ef8949518beb34487a3df71"}, - {file = "Pillow-8.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd24054aaf21e70a51e2a2a5ed1183560d3a69e6f9594a4bfe360a46f94eba83"}, - {file = "Pillow-8.3.2-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27a330bf7014ee034046db43ccbb05c766aa9e70b8d6c5260bfc38d73103b0ba"}, - {file = "Pillow-8.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13654b521fb98abdecec105ea3fb5ba863d1548c9b58831dd5105bb3873569f1"}, - {file = "Pillow-8.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a1bd983c565f92779be456ece2479840ec39d386007cd4ae83382646293d681b"}, - {file = "Pillow-8.3.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:4326ea1e2722f3dc00ed77c36d3b5354b8fb7399fb59230249ea6d59cbed90da"}, - {file = "Pillow-8.3.2-cp37-cp37m-win32.whl", hash = "sha256:085a90a99404b859a4b6c3daa42afde17cb3ad3115e44a75f0d7b4a32f06a6c9"}, - {file = "Pillow-8.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:18a07a683805d32826c09acfce44a90bf474e6a66ce482b1c7fcd3757d588df3"}, - {file = "Pillow-8.3.2-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:4e59e99fd680e2b8b11bbd463f3c9450ab799305d5f2bafb74fefba6ac058616"}, - {file = "Pillow-8.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4d89a2e9219a526401015153c0e9dd48319ea6ab9fe3b066a20aa9aee23d9fd3"}, - {file = "Pillow-8.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56fd98c8294f57636084f4b076b75f86c57b2a63a8410c0cd172bc93695ee979"}, - {file = "Pillow-8.3.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b11c9d310a3522b0fd3c35667914271f570576a0e387701f370eb39d45f08a4"}, - {file = "Pillow-8.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0412516dcc9de9b0a1e0ae25a280015809de8270f134cc2c1e32c4eeb397cf30"}, - {file = "Pillow-8.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bcb04ff12e79b28be6c9988f275e7ab69f01cc2ba319fb3114f87817bb7c74b6"}, - {file = "Pillow-8.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:0b9911ec70731711c3b6ebcde26caea620cbdd9dcb73c67b0730c8817f24711b"}, - {file = "Pillow-8.3.2-cp38-cp38-win32.whl", hash = "sha256:ce2e5e04bb86da6187f96d7bab3f93a7877830981b37f0287dd6479e27a10341"}, - {file = "Pillow-8.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:35d27687f027ad25a8d0ef45dd5208ef044c588003cdcedf05afb00dbc5c2deb"}, - {file = "Pillow-8.3.2-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:04835e68ef12904bc3e1fd002b33eea0779320d4346082bd5b24bec12ad9c3e9"}, - {file = "Pillow-8.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:10e00f7336780ca7d3653cf3ac26f068fa11b5a96894ea29a64d3dc4b810d630"}, - {file = "Pillow-8.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cde7a4d3687f21cffdf5bb171172070bb95e02af448c4c8b2f223d783214056"}, - {file = "Pillow-8.3.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c3ff00110835bdda2b1e2b07f4a2548a39744bb7de5946dc8e95517c4fb2ca6"}, - {file = "Pillow-8.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35d409030bf3bd05fa66fb5fdedc39c521b397f61ad04309c90444e893d05f7d"}, - {file = "Pillow-8.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6bff50ba9891be0a004ef48828e012babaaf7da204d81ab9be37480b9020a82b"}, - {file = "Pillow-8.3.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7dbfbc0020aa1d9bc1b0b8bcf255a7d73f4ad0336f8fd2533fcc54a4ccfb9441"}, - {file = "Pillow-8.3.2-cp39-cp39-win32.whl", hash = "sha256:963ebdc5365d748185fdb06daf2ac758116deecb2277ec5ae98139f93844bc09"}, - {file = "Pillow-8.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:cc9d0dec711c914ed500f1d0d3822868760954dce98dfb0b7382a854aee55d19"}, - {file = "Pillow-8.3.2-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:2c661542c6f71dfd9dc82d9d29a8386287e82813b0375b3a02983feac69ef864"}, - {file = "Pillow-8.3.2-pp36-pypy36_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:548794f99ff52a73a156771a0402f5e1c35285bd981046a502d7e4793e8facaa"}, - {file = "Pillow-8.3.2-pp36-pypy36_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8b68f565a4175e12e68ca900af8910e8fe48aaa48fd3ca853494f384e11c8bcd"}, - {file = "Pillow-8.3.2-pp36-pypy36_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:838eb85de6d9307c19c655c726f8d13b8b646f144ca6b3771fa62b711ebf7624"}, - {file = "Pillow-8.3.2-pp36-pypy36_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:feb5db446e96bfecfec078b943cc07744cc759893cef045aa8b8b6d6aaa8274e"}, - {file = "Pillow-8.3.2-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:fc0db32f7223b094964e71729c0361f93db43664dd1ec86d3df217853cedda87"}, - {file = "Pillow-8.3.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fd4fd83aa912d7b89b4b4a1580d30e2a4242f3936882a3f433586e5ab97ed0d5"}, - {file = "Pillow-8.3.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d0c8ebbfd439c37624db98f3877d9ed12c137cadd99dde2d2eae0dab0bbfc355"}, - {file = "Pillow-8.3.2-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6cb3dd7f23b044b0737317f892d399f9e2f0b3a02b22b2c692851fb8120d82c6"}, - {file = "Pillow-8.3.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a66566f8a22561fc1a88dc87606c69b84fa9ce724f99522cf922c801ec68f5c1"}, - {file = "Pillow-8.3.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ce651ca46d0202c302a535d3047c55a0131a720cf554a578fc1b8a2aff0e7d96"}, - {file = "Pillow-8.3.2.tar.gz", hash = "sha256:dde3f3ed8d00c72631bc19cbfff8ad3b6215062a5eed402381ad365f82f0c18c"}, + {file = "Pillow-8.4.0-cp310-cp310-macosx_10_10_universal2.whl", hash = "sha256:81f8d5c81e483a9442d72d182e1fb6dcb9723f289a57e8030811bac9ea3fef8d"}, + {file = "Pillow-8.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3f97cfb1e5a392d75dd8b9fd274d205404729923840ca94ca45a0af57e13dbe6"}, + {file = "Pillow-8.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb9fc393f3c61f9054e1ed26e6fe912c7321af2f41ff49d3f83d05bacf22cc78"}, + {file = "Pillow-8.4.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d82cdb63100ef5eedb8391732375e6d05993b765f72cb34311fab92103314649"}, + {file = "Pillow-8.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62cc1afda735a8d109007164714e73771b499768b9bb5afcbbee9d0ff374b43f"}, + {file = "Pillow-8.4.0-cp310-cp310-win32.whl", hash = "sha256:e3dacecfbeec9a33e932f00c6cd7996e62f53ad46fbe677577394aaa90ee419a"}, + {file = "Pillow-8.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:620582db2a85b2df5f8a82ddeb52116560d7e5e6b055095f04ad828d1b0baa39"}, + {file = "Pillow-8.4.0-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:1bc723b434fbc4ab50bb68e11e93ce5fb69866ad621e3c2c9bdb0cd70e345f55"}, + {file = "Pillow-8.4.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72cbcfd54df6caf85cc35264c77ede902452d6df41166010262374155947460c"}, + {file = "Pillow-8.4.0-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70ad9e5c6cb9b8487280a02c0ad8a51581dcbbe8484ce058477692a27c151c0a"}, + {file = "Pillow-8.4.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:25a49dc2e2f74e65efaa32b153527fc5ac98508d502fa46e74fa4fd678ed6645"}, + {file = "Pillow-8.4.0-cp36-cp36m-win32.whl", hash = "sha256:93ce9e955cc95959df98505e4608ad98281fff037350d8c2671c9aa86bcf10a9"}, + {file = "Pillow-8.4.0-cp36-cp36m-win_amd64.whl", hash = "sha256:2e4440b8f00f504ee4b53fe30f4e381aae30b0568193be305256b1462216feff"}, + {file = "Pillow-8.4.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:8c803ac3c28bbc53763e6825746f05cc407b20e4a69d0122e526a582e3b5e153"}, + {file = "Pillow-8.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8a17b5d948f4ceeceb66384727dde11b240736fddeda54ca740b9b8b1556b29"}, + {file = "Pillow-8.4.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1394a6ad5abc838c5cd8a92c5a07535648cdf6d09e8e2d6df916dfa9ea86ead8"}, + {file = "Pillow-8.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:792e5c12376594bfcb986ebf3855aa4b7c225754e9a9521298e460e92fb4a488"}, + {file = "Pillow-8.4.0-cp37-cp37m-win32.whl", hash = "sha256:d99ec152570e4196772e7a8e4ba5320d2d27bf22fdf11743dd882936ed64305b"}, + {file = "Pillow-8.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:7b7017b61bbcdd7f6363aeceb881e23c46583739cb69a3ab39cb384f6ec82e5b"}, + {file = "Pillow-8.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:d89363f02658e253dbd171f7c3716a5d340a24ee82d38aab9183f7fdf0cdca49"}, + {file = "Pillow-8.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0a0956fdc5defc34462bb1c765ee88d933239f9a94bc37d132004775241a7585"}, + {file = "Pillow-8.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b7bb9de00197fb4261825c15551adf7605cf14a80badf1761d61e59da347779"}, + {file = "Pillow-8.4.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:72b9e656e340447f827885b8d7a15fc8c4e68d410dc2297ef6787eec0f0ea409"}, + {file = "Pillow-8.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5a4532a12314149d8b4e4ad8ff09dde7427731fcfa5917ff16d0291f13609df"}, + {file = "Pillow-8.4.0-cp38-cp38-win32.whl", hash = "sha256:82aafa8d5eb68c8463b6e9baeb4f19043bb31fefc03eb7b216b51e6a9981ae09"}, + {file = "Pillow-8.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:066f3999cb3b070a95c3652712cffa1a748cd02d60ad7b4e485c3748a04d9d76"}, + {file = "Pillow-8.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:5503c86916d27c2e101b7f71c2ae2cddba01a2cf55b8395b0255fd33fa4d1f1a"}, + {file = "Pillow-8.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4acc0985ddf39d1bc969a9220b51d94ed51695d455c228d8ac29fcdb25810e6e"}, + {file = "Pillow-8.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b052a619a8bfcf26bd8b3f48f45283f9e977890263e4571f2393ed8898d331b"}, + {file = "Pillow-8.4.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:493cb4e415f44cd601fcec11c99836f707bb714ab03f5ed46ac25713baf0ff20"}, + {file = "Pillow-8.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8831cb7332eda5dc89b21a7bce7ef6ad305548820595033a4b03cf3091235ed"}, + {file = "Pillow-8.4.0-cp39-cp39-win32.whl", hash = "sha256:5e9ac5f66616b87d4da618a20ab0a38324dbe88d8a39b55be8964eb520021e02"}, + {file = "Pillow-8.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:3eb1ce5f65908556c2d8685a8f0a6e989d887ec4057326f6c22b24e8a172c66b"}, + {file = "Pillow-8.4.0-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:ddc4d832a0f0b4c52fff973a0d44b6c99839a9d016fe4e6a1cb8f3eea96479c2"}, + {file = "Pillow-8.4.0-pp36-pypy36_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a3e5ddc44c14042f0844b8cf7d2cd455f6cc80fd7f5eefbe657292cf601d9ad"}, + {file = "Pillow-8.4.0-pp36-pypy36_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c70e94281588ef053ae8998039610dbd71bc509e4acbc77ab59d7d2937b10698"}, + {file = "Pillow-8.4.0-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:3862b7256046fcd950618ed22d1d60b842e3a40a48236a5498746f21189afbbc"}, + {file = "Pillow-8.4.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4901622493f88b1a29bd30ec1a2f683782e57c3c16a2dbc7f2595ba01f639df"}, + {file = "Pillow-8.4.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84c471a734240653a0ec91dec0996696eea227eafe72a33bd06c92697728046b"}, + {file = "Pillow-8.4.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:244cf3b97802c34c41905d22810846802a3329ddcb93ccc432870243211c79fc"}, + {file = "Pillow-8.4.0.tar.gz", hash = "sha256:b8e2f83c56e141920c39464b852de3719dfbfb6e3c99a2d8da0edf4fb33176ed"}, ] platformdirs = [ {file = "platformdirs-2.4.0-py3-none-any.whl", hash = "sha256:8868bbe3c3c80d42f20156f22e7131d2fb321f5bc86a2a345375c6481a67021d"}, @@ -2248,16 +2249,16 @@ pre-commit = [ {file = "pre_commit-2.15.0.tar.gz", hash = "sha256:3c25add78dbdfb6a28a651780d5c311ac40dd17f160eb3954a0c59da40a505a7"}, ] py = [ - {file = "py-1.10.0-py2.py3-none-any.whl", hash = "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a"}, - {file = "py-1.10.0.tar.gz", hash = "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3"}, + {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, + {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, ] pycodestyle = [ {file = "pycodestyle-2.7.0-py2.py3-none-any.whl", hash = "sha256:514f76d918fcc0b55c6680472f0a37970994e07bbb80725808c17089be302068"}, {file = "pycodestyle-2.7.0.tar.gz", hash = "sha256:c389c1d06bf7904078ca03399a4816f974a1d590090fecea0c63ec26ebaf1cef"}, ] pycparser = [ - {file = "pycparser-2.20-py2.py3-none-any.whl", hash = "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705"}, - {file = "pycparser-2.20.tar.gz", hash = "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0"}, + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, ] pydot = [ {file = "pydot-1.4.2-py2.py3-none-any.whl", hash = "sha256:66c98190c65b8d2e2382a441b4c0edfdb4f4c025ef9cb9874de478fb0793a451"}, @@ -2268,8 +2269,8 @@ pyflakes = [ {file = "pyflakes-2.3.1.tar.gz", hash = "sha256:f5bc8ecabc05bb9d291eb5203d6810b49040f6ff446a756326104746cc00c1db"}, ] pyjwt = [ - {file = "PyJWT-2.2.0-py3-none-any.whl", hash = "sha256:b0ed5824c8ecc5362e540c65dc6247567db130c4226670bf7699aec92fb4dae1"}, - {file = "PyJWT-2.2.0.tar.gz", hash = "sha256:a0b9a3b4e5ca5517cac9f1a6e9cd30bf1aa80be74fcdf4e28eded582ecfcfbae"}, + {file = "PyJWT-2.3.0-py3-none-any.whl", hash = "sha256:e0c4bb8d9f0af0c7f5b1ec4c5036309617d03d56932877f2f7a0beeb5318322f"}, + {file = "PyJWT-2.3.0.tar.gz", hash = "sha256:b888b4d56f06f6dcd777210c334e69c737be74755d3e5e9ee3fe67dc18a0ee41"}, ] pymdgen = [ {file = "pymdgen-1.0.0.tar.gz", hash = "sha256:d02d298074db01269e6817b41016461cae9cc1a6231720ccff631687bf2f33da"}, @@ -2418,47 +2419,55 @@ rdap = [ {file = "rdap-1.2.1.tar.gz", hash = "sha256:f2b2d379ba6f9d19027d5cca05ffe35424259754c702f0ab48c2960f4c52d21b"}, ] regex = [ - {file = "regex-2021.10.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:981c786293a3115bc14c103086ae54e5ee50ca57f4c02ce7cf1b60318d1e8072"}, - {file = "regex-2021.10.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51feefd58ac38eb91a21921b047da8644155e5678e9066af7bcb30ee0dca7361"}, - {file = "regex-2021.10.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea8de658d7db5987b11097445f2b1f134400e2232cb40e614e5f7b6f5428710e"}, - {file = "regex-2021.10.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1ce02f420a7ec3b2480fe6746d756530f69769292eca363218c2291d0b116a01"}, - {file = "regex-2021.10.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:39079ebf54156be6e6902f5c70c078f453350616cfe7bfd2dd15bdb3eac20ccc"}, - {file = "regex-2021.10.8-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ff24897f6b2001c38a805d53b6ae72267025878d35ea225aa24675fbff2dba7f"}, - {file = "regex-2021.10.8-cp310-cp310-win32.whl", hash = "sha256:c6569ba7b948c3d61d27f04e2b08ebee24fec9ff8e9ea154d8d1e975b175bfa7"}, - {file = "regex-2021.10.8-cp310-cp310-win_amd64.whl", hash = "sha256:45cb0f7ff782ef51bc79e227a87e4e8f24bc68192f8de4f18aae60b1d60bc152"}, - {file = "regex-2021.10.8-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:fab3ab8aedfb443abb36729410403f0fe7f60ad860c19a979d47fb3eb98ef820"}, - {file = "regex-2021.10.8-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74e55f8d66f1b41d44bc44c891bcf2c7fad252f8f323ee86fba99d71fd1ad5e3"}, - {file = "regex-2021.10.8-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d52c5e089edbdb6083391faffbe70329b804652a53c2fdca3533e99ab0580d9"}, - {file = "regex-2021.10.8-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1abbd95cbe9e2467cac65c77b6abd9223df717c7ae91a628502de67c73bf6838"}, - {file = "regex-2021.10.8-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b9b5c215f3870aa9b011c00daeb7be7e1ae4ecd628e9beb6d7e6107e07d81287"}, - {file = "regex-2021.10.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f540f153c4f5617bc4ba6433534f8916d96366a08797cbbe4132c37b70403e92"}, - {file = "regex-2021.10.8-cp36-cp36m-win32.whl", hash = "sha256:1f51926db492440e66c89cd2be042f2396cf91e5b05383acd7372b8cb7da373f"}, - {file = "regex-2021.10.8-cp36-cp36m-win_amd64.whl", hash = "sha256:5f55c4804797ef7381518e683249310f7f9646da271b71cb6b3552416c7894ee"}, - {file = "regex-2021.10.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fb2baff66b7d2267e07ef71e17d01283b55b3cc51a81b54cc385e721ae172ba4"}, - {file = "regex-2021.10.8-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e527ab1c4c7cf2643d93406c04e1d289a9d12966529381ce8163c4d2abe4faf"}, - {file = "regex-2021.10.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c98b013273e9da5790ff6002ab326e3f81072b4616fd95f06c8fa733d2745f"}, - {file = "regex-2021.10.8-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:55ef044899706c10bc0aa052f2fc2e58551e2510694d6aae13f37c50f3f6ff61"}, - {file = "regex-2021.10.8-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa0ab3530a279a3b7f50f852f1bab41bc304f098350b03e30a3876b7dd89840e"}, - {file = "regex-2021.10.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a37305eb3199d8f0d8125ec2fb143ba94ff6d6d92554c4b8d4a8435795a6eccd"}, - {file = "regex-2021.10.8-cp37-cp37m-win32.whl", hash = "sha256:2efd47704bbb016136fe34dfb74c805b1ef5c7313aef3ce6dcb5ff844299f432"}, - {file = "regex-2021.10.8-cp37-cp37m-win_amd64.whl", hash = "sha256:924079d5590979c0e961681507eb1773a142553564ccae18d36f1de7324e71ca"}, - {file = "regex-2021.10.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b09d3904bf312d11308d9a2867427479d277365b1617e48ad09696fa7dfcdf59"}, - {file = "regex-2021.10.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f125fce0a0ae4fd5c3388d369d7a7d78f185f904c90dd235f7ecf8fe13fa741"}, - {file = "regex-2021.10.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f199419a81c1016e0560c39773c12f0bd924c37715bffc64b97140d2c314354"}, - {file = "regex-2021.10.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:09e1031e2059abd91177c302da392a7b6859ceda038be9e015b522a182c89e4f"}, - {file = "regex-2021.10.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c070d5895ac6aeb665bd3cd79f673775caf8d33a0b569e98ac434617ecea57d"}, - {file = "regex-2021.10.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:176796cb7f82a7098b0c436d6daac82f57b9101bb17b8e8119c36eecf06a60a3"}, - {file = "regex-2021.10.8-cp38-cp38-win32.whl", hash = "sha256:5e5796d2f36d3c48875514c5cd9e4325a1ca172fc6c78b469faa8ddd3d770593"}, - {file = "regex-2021.10.8-cp38-cp38-win_amd64.whl", hash = "sha256:e4204708fa116dd03436a337e8e84261bc8051d058221ec63535c9403a1582a1"}, - {file = "regex-2021.10.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b8b6ee6555b6fbae578f1468b3f685cdfe7940a65675611365a7ea1f8d724991"}, - {file = "regex-2021.10.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:973499dac63625a5ef9dfa4c791aa33a502ddb7615d992bdc89cf2cc2285daa3"}, - {file = "regex-2021.10.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88dc3c1acd3f0ecfde5f95c32fcb9beda709dbdf5012acdcf66acbc4794468eb"}, - {file = "regex-2021.10.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4786dae85c1f0624ac77cb3813ed99267c9adb72e59fdc7297e1cf4d6036d493"}, - {file = "regex-2021.10.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe6ce4f3d3c48f9f402da1ceb571548133d3322003ce01b20d960a82251695d2"}, - {file = "regex-2021.10.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9e3e2cea8f1993f476a6833ef157f5d9e8c75a59a8d8b0395a9a6887a097243b"}, - {file = "regex-2021.10.8-cp39-cp39-win32.whl", hash = "sha256:82cfb97a36b1a53de32b642482c6c46b6ce80803854445e19bc49993655ebf3b"}, - {file = "regex-2021.10.8-cp39-cp39-win_amd64.whl", hash = "sha256:b04e512eb628ea82ed86eb31c0f7fc6842b46bf2601b66b1356a7008327f7700"}, - {file = "regex-2021.10.8.tar.gz", hash = "sha256:26895d7c9bbda5c52b3635ce5991caa90fbb1ddfac9c9ff1c7ce505e2282fb2a"}, + {file = "regex-2021.11.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:897c539f0f3b2c3a715be651322bef2167de1cdc276b3f370ae81a3bda62df71"}, + {file = "regex-2021.11.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:886f459db10c0f9d17c87d6594e77be915f18d343ee138e68d259eb385f044a8"}, + {file = "regex-2021.11.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:075b0fdbaea81afcac5a39a0d1bb91de887dd0d93bf692a5dd69c430e7fc58cb"}, + {file = "regex-2021.11.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c6238d30dcff141de076344cf7f52468de61729c2f70d776fce12f55fe8df790"}, + {file = "regex-2021.11.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7fab29411d75c2eb48070020a40f80255936d7c31357b086e5931c107d48306e"}, + {file = "regex-2021.11.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0148988af0182a0a4e5020e7c168014f2c55a16d11179610f7883dd48ac0ebe"}, + {file = "regex-2021.11.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:be30cd315db0168063a1755fa20a31119da91afa51da2907553493516e165640"}, + {file = "regex-2021.11.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e9cec3a62d146e8e122d159ab93ac32c988e2ec0dcb1e18e9e53ff2da4fbd30c"}, + {file = "regex-2021.11.2-cp310-cp310-win32.whl", hash = "sha256:41c66bd6750237a8ed23028a6c9173dc0c92dc24c473e771d3bfb9ee817700c3"}, + {file = "regex-2021.11.2-cp310-cp310-win_amd64.whl", hash = "sha256:0075fe4e2c2720a685fef0f863edd67740ff78c342cf20b2a79bc19388edf5db"}, + {file = "regex-2021.11.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0ed3465acf8c7c10aa2e0f3d9671da410ead63b38a77283ef464cbb64275df58"}, + {file = "regex-2021.11.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab1fea8832976ad0bebb11f652b692c328043057d35e9ebc78ab0a7a30cf9a70"}, + {file = "regex-2021.11.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cb1e44d860345ab5d4f533b6c37565a22f403277f44c4d2d5e06c325da959883"}, + {file = "regex-2021.11.2-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9486ebda015913909bc28763c6b92fcc3b5e5a67dee4674bceed112109f5dfb8"}, + {file = "regex-2021.11.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20605bfad484e1341b2cbfea0708e4b211d233716604846baa54b94821f487cb"}, + {file = "regex-2021.11.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f20f9f430c33597887ba9bd76635476928e76cad2981643ca8be277b8e97aa96"}, + {file = "regex-2021.11.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1d85ca137756d62c8138c971453cafe64741adad1f6a7e63a22a5a8abdbd19fa"}, + {file = "regex-2021.11.2-cp36-cp36m-win32.whl", hash = "sha256:af23b9ca9a874ef0ec20e44467b8edd556c37b0f46f93abfa93752ea7c0e8d1e"}, + {file = "regex-2021.11.2-cp36-cp36m-win_amd64.whl", hash = "sha256:070336382ca92c16c45b4066c4ba9fa83fb0bd13d5553a82e07d344df8d58a84"}, + {file = "regex-2021.11.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ef4e53e2fdc997d91f5b682f81f7dc9661db9a437acce28745d765d251902d85"}, + {file = "regex-2021.11.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35ed5714467fc606551db26f80ee5d6aa1f01185586a7bccd96f179c4b974a11"}, + {file = "regex-2021.11.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ee36d5113b6506b97f45f2e8447cb9af146e60e3f527d93013d19f6d0405f3b"}, + {file = "regex-2021.11.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4fba661a4966adbd2c3c08d3caad6822ecb6878f5456588e2475ae23a6e47929"}, + {file = "regex-2021.11.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77f9d16f7970791f17ecce7e7f101548314ed1ee2583d4268601f30af3170856"}, + {file = "regex-2021.11.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f6a28e87ba69f3a4f30d775b179aac55be1ce59f55799328a0d9b6df8f16b39d"}, + {file = "regex-2021.11.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9267e4fba27e6dd1008c4f2983cc548c98b4be4444e3e342db11296c0f45512f"}, + {file = "regex-2021.11.2-cp37-cp37m-win32.whl", hash = "sha256:d4bfe3bc3976ccaeb4ae32f51e631964e2f0e85b2b752721b7a02de5ce3b7f27"}, + {file = "regex-2021.11.2-cp37-cp37m-win_amd64.whl", hash = "sha256:2bb7cae741de1aa03e3dd3a7d98c304871eb155921ca1f0d7cc11f5aade913fd"}, + {file = "regex-2021.11.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:23f93e74409c210de4de270d4bf88fb8ab736a7400f74210df63a93728cf70d6"}, + {file = "regex-2021.11.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d8ee91e1c295beb5c132ebd78616814de26fedba6aa8687ea460c7f5eb289b72"}, + {file = "regex-2021.11.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e3ff69ab203b54ce5c480c3ccbe959394ea5beef6bd5ad1785457df7acea92e"}, + {file = "regex-2021.11.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e3c00cb5c71da655e1e5161481455479b613d500dd1bd252aa01df4f037c641f"}, + {file = "regex-2021.11.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4abf35e16f4b639daaf05a2602c1b1d47370e01babf9821306aa138924e3fe92"}, + {file = "regex-2021.11.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb11c982a849dc22782210b01d0c1b98eb3696ce655d58a54180774e4880ac66"}, + {file = "regex-2021.11.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e3755e0f070bc31567dfe447a02011bfa8444239b3e9e5cca6773a22133839"}, + {file = "regex-2021.11.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0621c90f28d17260b41838b22c81a79ff436141b322960eb49c7b3f91d1cbab6"}, + {file = "regex-2021.11.2-cp38-cp38-win32.whl", hash = "sha256:8fbe1768feafd3d0156556677b8ff234c7bf94a8110e906b2d73506f577a3269"}, + {file = "regex-2021.11.2-cp38-cp38-win_amd64.whl", hash = "sha256:f9ee98d658a146cb6507be720a0ce1b44f2abef8fb43c2859791d91aace17cd5"}, + {file = "regex-2021.11.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b3794cea825f101fe0df9af8a00f9fad8e119c91e39a28636b95ee2b45b6c2e5"}, + {file = "regex-2021.11.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3576e173e7b4f88f683b4de7db0c2af1b209bb48b2bf1c827a6f3564fad59a97"}, + {file = "regex-2021.11.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48b4f4810117a9072a5aa70f7fea5f86fa9efbe9a798312e0a05044bd707cc33"}, + {file = "regex-2021.11.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f5930d334c2f607711d54761956aedf8137f83f1b764b9640be21d25a976f3a4"}, + {file = "regex-2021.11.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:956187ff49db7014ceb31e88fcacf4cf63371e6e44d209cf8816cd4a2d61e11a"}, + {file = "regex-2021.11.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17e095f7f96a4b9f24b93c2c915f31a5201a6316618d919b0593afb070a5270e"}, + {file = "regex-2021.11.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a56735c35a3704603d9d7b243ee06139f0837bcac2171d9ba1d638ce1df0742a"}, + {file = "regex-2021.11.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:adf35d88d9cffc202e6046e4c32e1e11a1d0238b2fcf095c94f109e510ececea"}, + {file = "regex-2021.11.2-cp39-cp39-win32.whl", hash = "sha256:30fe317332de0e50195665bc61a27d46e903d682f94042c36b3f88cb84bd7958"}, + {file = "regex-2021.11.2-cp39-cp39-win_amd64.whl", hash = "sha256:85289c25f658e3260b00178757c87f033f3d4b3e40aa4abdd4dc875ff11a94fb"}, + {file = "regex-2021.11.2.tar.gz", hash = "sha256:5e85dcfc5d0f374955015ae12c08365b565c6f1eaf36dd182476a4d8e5a1cdb7"}, ] requests = [ {file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"}, @@ -2543,16 +2552,16 @@ tld = [ {file = "tld-0.12.6.tar.gz", hash = "sha256:69fed19d26bb3f715366fb4af66fdeace896c55c052b00e8aaba3a7b63f3e7f0"}, ] tokenize-rt = [ - {file = "tokenize_rt-4.1.0-py2.py3-none-any.whl", hash = "sha256:b37251fa28c21e8cce2e42f7769a35fba2dd2ecafb297208f9a9a8add3ca7793"}, - {file = "tokenize_rt-4.1.0.tar.gz", hash = "sha256:ab339b5ff829eb5e198590477f9c03c84e762b3e455e74c018956e7e326cbc70"}, + {file = "tokenize_rt-4.2.1-py2.py3-none-any.whl", hash = "sha256:08a27fa032a81cf45e8858d0ac706004fcd523e8463415ddf1442be38e204ea8"}, + {file = "tokenize_rt-4.2.1.tar.gz", hash = "sha256:0d4f69026fed520f8a1e0103aa36c406ef4661417f20ca643f913e33531b3b94"}, ] toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, ] tomli = [ - {file = "tomli-1.2.1-py3-none-any.whl", hash = "sha256:8dd0e9524d6f386271a36b41dbf6c57d8e32fd96fd22b6584679dc569d20899f"}, - {file = "tomli-1.2.1.tar.gz", hash = "sha256:a5b75cb6f3968abb47af1b40c1819dc519ea82bcc065776a866e8d74c5ca9442"}, + {file = "tomli-1.2.2-py3-none-any.whl", hash = "sha256:f04066f68f5554911363063a30b108d2b5a5b1a010aa8b6132af78489fe3aade"}, + {file = "tomli-1.2.2.tar.gz", hash = "sha256:c6ce0015eb38820eaf32b5db832dbc26deb3dd427bd5f6556cf0acac2c214fee"}, ] "twentyc.rpc" = [ {file = "twentyc.rpc-0.4.0.tar.gz", hash = "sha256:c6a08a0fa8610332f430911061a662efee8c251a5568c1ffd592c566d9da0768"}, @@ -2578,8 +2587,8 @@ uwsgi = [ {file = "uwsgi-2.0.20.tar.gz", hash = "sha256:88ab9867d8973d8ae84719cf233b7dafc54326fcaec89683c3f9f77c002cdff9"}, ] virtualenv = [ - {file = "virtualenv-20.8.1-py2.py3-none-any.whl", hash = "sha256:10062e34c204b5e4ec5f62e6ef2473f8ba76513a9a617e873f1f8fb4a519d300"}, - {file = "virtualenv-20.8.1.tar.gz", hash = "sha256:bcc17f0b3a29670dd777d6f0755a4c04f28815395bca279cdcb213b97199a6b8"}, + {file = "virtualenv-20.10.0-py2.py3-none-any.whl", hash = "sha256:4b02e52a624336eece99c96e3ab7111f469c24ba226a53ec474e8e787b365814"}, + {file = "virtualenv-20.10.0.tar.gz", hash = "sha256:576d05b46eace16a9c348085f7d0dc8ef28713a2cabaa1cf0aea41e8f12c9218"}, ] watchdog = [ {file = "watchdog-2.1.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9693f35162dc6208d10b10ddf0458cc09ad70c30ba689d9206e02cd836ce28a3"}, @@ -2620,50 +2629,57 @@ whoosh = [ {file = "Whoosh-2.7.4.zip", hash = "sha256:e0857375f63e9041e03fedd5b7541f97cf78917ac1b6b06c1fcc9b45375dda69"}, ] wrapt = [ - {file = "wrapt-1.13.2-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3de7b4d3066cc610054e7aa2c005645e308df2f92be730aae3a47d42e910566a"}, - {file = "wrapt-1.13.2-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:8164069f775c698d15582bf6320a4f308c50d048c1c10cf7d7a341feaccf5df7"}, - {file = "wrapt-1.13.2-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9adee1891253670575028279de8365c3a02d3489a74a66d774c321472939a0b1"}, - {file = "wrapt-1.13.2-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:a70d876c9aba12d3bd7f8f1b05b419322c6789beb717044eea2c8690d35cb91b"}, - {file = "wrapt-1.13.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:3f87042623530bcffea038f824b63084180513c21e2e977291a9a7e65a66f13b"}, - {file = "wrapt-1.13.2-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:e634136f700a21e1fcead0c137f433dde928979538c14907640607d43537d468"}, - {file = "wrapt-1.13.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:3e33c138d1e3620b1e0cc6fd21e46c266393ed5dae0d595b7ed5a6b73ed57aa0"}, - {file = "wrapt-1.13.2-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:283e402e5357e104ac1e3fba5791220648e9af6fb14ad7d9cc059091af2b31d2"}, - {file = "wrapt-1.13.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:ccb34ce599cab7f36a4c90318697ead18312c67a9a76327b3f4f902af8f68ea1"}, - {file = "wrapt-1.13.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:fbad5ba74c46517e6488149514b2e2348d40df88cd6b52a83855b7a8bf04723f"}, - {file = "wrapt-1.13.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:724ed2bc9c91a2b9026e5adce310fa60c6e7c8760b03391445730b9789b9d108"}, - {file = "wrapt-1.13.2-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:83f2793ec6f3ef513ad8d5b9586f5ee6081cad132e6eae2ecb7eac1cc3decae0"}, - {file = "wrapt-1.13.2-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:0473d1558b93e314e84313cc611f6c86be779369f9d3734302bf185a4d2625b1"}, - {file = "wrapt-1.13.2-cp35-cp35m-win32.whl", hash = "sha256:15eee0e6fd07f48af2f66d0e6f2ff1916ffe9732d464d5e2390695296872cad9"}, - {file = "wrapt-1.13.2-cp35-cp35m-win_amd64.whl", hash = "sha256:bc85d17d90201afd88e3d25421da805e4e135012b5d1f149e4de2981394b2a52"}, - {file = "wrapt-1.13.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c6ee5f8734820c21b9b8bf705e99faba87f21566d20626568eeb0d62cbeaf23c"}, - {file = "wrapt-1.13.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:53c6706a1bcfb6436f1625511b95b812798a6d2ccc51359cd791e33722b5ea32"}, - {file = "wrapt-1.13.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:fbe6aebc9559fed7ea27de51c2bf5c25ba2a4156cf0017556f72883f2496ee9a"}, - {file = "wrapt-1.13.2-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:0582180566e7a13030f896c2f1ac6a56134ab5f3c3f4c5538086f758b1caf3f2"}, - {file = "wrapt-1.13.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:bff0a59387a0a2951cb869251257b6553663329a1b5525b5226cab8c88dcbe7e"}, - {file = "wrapt-1.13.2-cp36-cp36m-win32.whl", hash = "sha256:df3eae297a5f1594d1feb790338120f717dac1fa7d6feed7b411f87e0f2401c7"}, - {file = "wrapt-1.13.2-cp36-cp36m-win_amd64.whl", hash = "sha256:1eb657ed84f4d3e6ad648483c8a80a0cf0a78922ef94caa87d327e2e1ad49b48"}, - {file = "wrapt-1.13.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a0cdedf681db878416c05e1831ec69691b0e6577ac7dca9d4f815632e3549580"}, - {file = "wrapt-1.13.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:87ee3c73bdfb4367b26c57259995935501829f00c7b3eed373e2ad19ec21e4e4"}, - {file = "wrapt-1.13.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:3e0d16eedc242d01a6f8cf0623e9cdc3b869329da3f97a15961d8864111d8cf0"}, - {file = "wrapt-1.13.2-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:8318088860968c07e741537030b1abdd8908ee2c71fbe4facdaade624a09e006"}, - {file = "wrapt-1.13.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:d90520616fce71c05dedeac3a0fe9991605f0acacd276e5f821842e454485a70"}, - {file = "wrapt-1.13.2-cp37-cp37m-win32.whl", hash = "sha256:22142afab65daffc95863d78effcbd31c19a8003eca73de59f321ee77f73cadb"}, - {file = "wrapt-1.13.2-cp37-cp37m-win_amd64.whl", hash = "sha256:d0d717e10f952df7ea41200c507cc7e24458f4c45b56c36ad418d2e79dacd1d4"}, - {file = "wrapt-1.13.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:593cb049ce1c391e0288523b30426c4430b26e74c7e6f6e2844bd99ac7ecc831"}, - {file = "wrapt-1.13.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:8860c8011a6961a651b1b9f46fdbc589ab63b0a50d645f7d92659618a3655867"}, - {file = "wrapt-1.13.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:ada5e29e59e2feb710589ca1c79fd989b1dd94d27079dc1d199ec954a6ecc724"}, - {file = "wrapt-1.13.2-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:fdede980273aeca591ad354608778365a3a310e0ecdd7a3587b38bc5be9b1808"}, - {file = "wrapt-1.13.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:af9480de8e63c5f959a092047aaf3d7077422ded84695b3398f5d49254af3e90"}, - {file = "wrapt-1.13.2-cp38-cp38-win32.whl", hash = "sha256:c65e623ea7556e39c4f0818200a046cbba7575a6b570ff36122c276fdd30ab0a"}, - {file = "wrapt-1.13.2-cp38-cp38-win_amd64.whl", hash = "sha256:b20703356cae1799080d0ad15085dc3213c1ac3f45e95afb9f12769b98231528"}, - {file = "wrapt-1.13.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1c5c4cf188b5643a97e87e2110bbd4f5bc491d54a5b90633837b34d5df6a03fe"}, - {file = "wrapt-1.13.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:82223f72eba6f63eafca87a0f614495ae5aa0126fe54947e2b8c023969e9f2d7"}, - {file = "wrapt-1.13.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:81a4cf257263b299263472d669692785f9c647e7dca01c18286b8f116dbf6b38"}, - {file = "wrapt-1.13.2-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:728e2d9b7a99dd955d3426f237b940fc74017c4a39b125fec913f575619ddfe9"}, - {file = "wrapt-1.13.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:7574de567dcd4858a2ffdf403088d6df8738b0e1eabea220553abf7c9048f59e"}, - {file = "wrapt-1.13.2-cp39-cp39-win32.whl", hash = "sha256:c7ac2c7a8e34bd06710605b21dd1f3576764443d68e069d2afba9b116014d072"}, - {file = "wrapt-1.13.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e6d1a8eeef415d7fb29fe017de0e48f45e45efd2d1bfda28fc50b7b330859ef"}, - {file = "wrapt-1.13.2.tar.gz", hash = "sha256:dca56cc5963a5fd7c2aa8607017753f534ee514e09103a6c55d2db70b50e7447"}, + {file = "wrapt-1.13.3-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:e05e60ff3b2b0342153be4d1b597bbcfd8330890056b9619f4ad6b8d5c96a81a"}, + {file = "wrapt-1.13.3-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:85148f4225287b6a0665eef08a178c15097366d46b210574a658c1ff5b377489"}, + {file = "wrapt-1.13.3-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:2dded5496e8f1592ec27079b28b6ad2a1ef0b9296d270f77b8e4a3a796cf6909"}, + {file = "wrapt-1.13.3-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:e94b7d9deaa4cc7bac9198a58a7240aaf87fe56c6277ee25fa5b3aa1edebd229"}, + {file = "wrapt-1.13.3-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:498e6217523111d07cd67e87a791f5e9ee769f9241fcf8a379696e25806965af"}, + {file = "wrapt-1.13.3-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:ec7e20258ecc5174029a0f391e1b948bf2906cd64c198a9b8b281b811cbc04de"}, + {file = "wrapt-1.13.3-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:87883690cae293541e08ba2da22cacaae0a092e0ed56bbba8d018cc486fbafbb"}, + {file = "wrapt-1.13.3-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:f99c0489258086308aad4ae57da9e8ecf9e1f3f30fa35d5e170b4d4896554d80"}, + {file = "wrapt-1.13.3-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:6a03d9917aee887690aa3f1747ce634e610f6db6f6b332b35c2dd89412912bca"}, + {file = "wrapt-1.13.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:936503cb0a6ed28dbfa87e8fcd0a56458822144e9d11a49ccee6d9a8adb2ac44"}, + {file = "wrapt-1.13.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f9c51d9af9abb899bd34ace878fbec8bf357b3194a10c4e8e0a25512826ef056"}, + {file = "wrapt-1.13.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:220a869982ea9023e163ba915077816ca439489de6d2c09089b219f4e11b6785"}, + {file = "wrapt-1.13.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:0877fe981fd76b183711d767500e6b3111378ed2043c145e21816ee589d91096"}, + {file = "wrapt-1.13.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:43e69ffe47e3609a6aec0fe723001c60c65305784d964f5007d5b4fb1bc6bf33"}, + {file = "wrapt-1.13.3-cp310-cp310-win32.whl", hash = "sha256:78dea98c81915bbf510eb6a3c9c24915e4660302937b9ae05a0947164248020f"}, + {file = "wrapt-1.13.3-cp310-cp310-win_amd64.whl", hash = "sha256:ea3e746e29d4000cd98d572f3ee2a6050a4f784bb536f4ac1f035987fc1ed83e"}, + {file = "wrapt-1.13.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:8c73c1a2ec7c98d7eaded149f6d225a692caa1bd7b2401a14125446e9e90410d"}, + {file = "wrapt-1.13.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:086218a72ec7d986a3eddb7707c8c4526d677c7b35e355875a0fe2918b059179"}, + {file = "wrapt-1.13.3-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:e92d0d4fa68ea0c02d39f1e2f9cb5bc4b4a71e8c442207433d8db47ee79d7aa3"}, + {file = "wrapt-1.13.3-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:d4a5f6146cfa5c7ba0134249665acd322a70d1ea61732723c7d3e8cc0fa80755"}, + {file = "wrapt-1.13.3-cp35-cp35m-win32.whl", hash = "sha256:8aab36778fa9bba1a8f06a4919556f9f8c7b33102bd71b3ab307bb3fecb21851"}, + {file = "wrapt-1.13.3-cp35-cp35m-win_amd64.whl", hash = "sha256:944b180f61f5e36c0634d3202ba8509b986b5fbaf57db3e94df11abee244ba13"}, + {file = "wrapt-1.13.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:2ebdde19cd3c8cdf8df3fc165bc7827334bc4e353465048b36f7deeae8ee0918"}, + {file = "wrapt-1.13.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:610f5f83dd1e0ad40254c306f4764fcdc846641f120c3cf424ff57a19d5f7ade"}, + {file = "wrapt-1.13.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5601f44a0f38fed36cc07db004f0eedeaadbdcec90e4e90509480e7e6060a5bc"}, + {file = "wrapt-1.13.3-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:e6906d6f48437dfd80464f7d7af1740eadc572b9f7a4301e7dd3d65db285cacf"}, + {file = "wrapt-1.13.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:766b32c762e07e26f50d8a3468e3b4228b3736c805018e4b0ec8cc01ecd88125"}, + {file = "wrapt-1.13.3-cp36-cp36m-win32.whl", hash = "sha256:5f223101f21cfd41deec8ce3889dc59f88a59b409db028c469c9b20cfeefbe36"}, + {file = "wrapt-1.13.3-cp36-cp36m-win_amd64.whl", hash = "sha256:f122ccd12fdc69628786d0c947bdd9cb2733be8f800d88b5a37c57f1f1d73c10"}, + {file = "wrapt-1.13.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:46f7f3af321a573fc0c3586612db4decb7eb37172af1bc6173d81f5b66c2e068"}, + {file = "wrapt-1.13.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:778fd096ee96890c10ce96187c76b3e99b2da44e08c9e24d5652f356873f6709"}, + {file = "wrapt-1.13.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0cb23d36ed03bf46b894cfec777eec754146d68429c30431c99ef28482b5c1df"}, + {file = "wrapt-1.13.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:96b81ae75591a795d8c90edc0bfaab44d3d41ffc1aae4d994c5aa21d9b8e19a2"}, + {file = "wrapt-1.13.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7dd215e4e8514004c8d810a73e342c536547038fb130205ec4bba9f5de35d45b"}, + {file = "wrapt-1.13.3-cp37-cp37m-win32.whl", hash = "sha256:47f0a183743e7f71f29e4e21574ad3fa95676136f45b91afcf83f6a050914829"}, + {file = "wrapt-1.13.3-cp37-cp37m-win_amd64.whl", hash = "sha256:fd76c47f20984b43d93de9a82011bb6e5f8325df6c9ed4d8310029a55fa361ea"}, + {file = "wrapt-1.13.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b73d4b78807bd299b38e4598b8e7bd34ed55d480160d2e7fdaabd9931afa65f9"}, + {file = "wrapt-1.13.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ec9465dd69d5657b5d2fa6133b3e1e989ae27d29471a672416fd729b429eb554"}, + {file = "wrapt-1.13.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dd91006848eb55af2159375134d724032a2d1d13bcc6f81cd8d3ed9f2b8e846c"}, + {file = "wrapt-1.13.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ae9de71eb60940e58207f8e71fe113c639da42adb02fb2bcbcaccc1ccecd092b"}, + {file = "wrapt-1.13.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:51799ca950cfee9396a87f4a1240622ac38973b6df5ef7a41e7f0b98797099ce"}, + {file = "wrapt-1.13.3-cp38-cp38-win32.whl", hash = "sha256:4b9c458732450ec42578b5642ac53e312092acf8c0bfce140ada5ca1ac556f79"}, + {file = "wrapt-1.13.3-cp38-cp38-win_amd64.whl", hash = "sha256:7dde79d007cd6dfa65afe404766057c2409316135cb892be4b1c768e3f3a11cb"}, + {file = "wrapt-1.13.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:981da26722bebb9247a0601e2922cedf8bb7a600e89c852d063313102de6f2cb"}, + {file = "wrapt-1.13.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:705e2af1f7be4707e49ced9153f8d72131090e52be9278b5dbb1498c749a1e32"}, + {file = "wrapt-1.13.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:25b1b1d5df495d82be1c9d2fad408f7ce5ca8a38085e2da41bb63c914baadff7"}, + {file = "wrapt-1.13.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:77416e6b17926d953b5c666a3cb718d5945df63ecf922af0ee576206d7033b5e"}, + {file = "wrapt-1.13.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:865c0b50003616f05858b22174c40ffc27a38e67359fa1495605f96125f76640"}, + {file = "wrapt-1.13.3-cp39-cp39-win32.whl", hash = "sha256:0a017a667d1f7411816e4bf214646d0ad5b1da2c1ea13dec6c162736ff25a374"}, + {file = "wrapt-1.13.3-cp39-cp39-win_amd64.whl", hash = "sha256:81bd7c90d28a4b2e1df135bfbd7c23aee3050078ca6441bead44c42483f9ebfb"}, + {file = "wrapt-1.13.3.tar.gz", hash = "sha256:1fea9cd438686e6682271d36f3481a9f3636195578bab9ca3382e2f5f01fc185"}, ] zipp = [ {file = "zipp-3.6.0-py3-none-any.whl", hash = "sha256:9fe5ea21568a0a70e50f273397638d39b03353731e6cbbb3fd8502a33fec40bc"}, diff --git a/pyproject.toml b/pyproject.toml index 60176df3..8548578c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,7 +13,7 @@ python = "^3.9" django = ">=3.2, <4" django-inet = "^1.0" django-handleref = "^1.0.1" -django-peeringdb = "==2.10.0" +django-peeringdb = "==2.11.0" djangorestframework = ">=3.12,<3.13" mysqlclient = ">=1.3.9" peeringdb = ">=1.1.0, <2" diff --git a/tests/test_cmd_ixf_ixp_member_import.py b/tests/test_cmd_ixf_ixp_member_import.py index 97b88023..19e38448 100644 --- a/tests/test_cmd_ixf_ixp_member_import.py +++ b/tests/test_cmd_ixf_ixp_member_import.py @@ -8,6 +8,7 @@ import jsonschema import pytest import requests import reversion +from django.core.cache import cache from django.core.management import call_command from django.test import override_settings @@ -30,6 +31,73 @@ from peeringdb_server.models import ( from .util import setup_test_data +@pytest.mark.django_db +def test_import_error_status(entities): + ixlan = entities["ixlan"] + ixlan.ixf_ixp_member_list_url = "localhost" + ixlan.ixf_ixp_import_enabled = True + ixlan.save() + + ixlan.ix.request_ixf_import() + + call_command("pdb_ixf_ixp_member_import", process_requested=0, commit=True) + + ixlan.ix.refresh_from_db() + # Import will fail. Check if import status is == error + assert ixlan.ix.ixf_import_request_status == "error" + assert ixlan.ix.ixf_import_request + + +@pytest.mark.django_db +def test_import_processed_count(entities_base): + ixf_import_data = setup_test_data("ixf.member.0") + + importer = ixf.Importer() + cache.set( + importer.cache_key("http://www.localhost.com"), ixf_import_data, timeout=None + ) + ixlans = entities_base["ixlan"] + for ixlan in ixlans: + ixlan.ixf_ixp_import_enabled = False + ixlan.ixf_ixp_member_list_url = "http://www.localhost.com" + importer.update(ixlan, data=None) + ixlan.ix.request_ixf_import() + + call_command( + "pdb_ixf_ixp_member_import", process_requested=1, commit=True, cache=True + ) + + assert ( + InternetExchange.objects.filter(ixf_import_request_status="finished").count() + == 1 + ) + + +@pytest.mark.django_db +def test_ignore_import_enabled(entities_base): + ixf_import_data = setup_test_data("ixf.member.0") + + importer = ixf.Importer() + cache.set( + importer.cache_key("http://www.localhost.com"), ixf_import_data, timeout=None + ) + ixlans = entities_base["ixlan"] + for ixlan in ixlans: + ixlan.ixf_ixp_import_enabled = True + ixlan.ixf_ixp_member_list_url = "http://www.localhost.com" + importer.update(ixlan, data=None) + ixlan.ix.request_ixf_import() + + call_command( + "pdb_ixf_ixp_member_import", process_requested=0, commit=None, cache=True + ) + + assert ( + InternetExchange.objects.filter(ixf_import_request_status="finished").count() + == 2 + ) + + @pytest.mark.django_db def test_reset_hints(entities, data_cmd_ixf_hints): ixf_import_data = json.loads(data_cmd_ixf_hints.json) @@ -44,23 +112,6 @@ def test_reset_hints(entities, data_cmd_ixf_hints): assert DeskProTicket.objects.filter(body__contains="reset_hints").count() == 1 -@pytest.mark.django_db -def test_reset_process_requested(entities): - ixlan = entities["ixlan"] - ixlan.ixf_ixp_member_list_url = "localhost" - ixlan.ixf_ixp_import_enabled = True - ixlan.save() - - ixlan.ix.request_ixf_import() - - call_command("pdb_ixf_ixp_member_import", process_requested=0, commit=True) - - ixlan.ix.refresh_from_db() - - assert ixlan.ix.ixf_import_request_status == "finished" - assert ixlan.ix.ixf_import_request - - @pytest.mark.django_db def test_reset_dismissals(entities, data_cmd_ixf_dismissals): ixf_import_data = json.loads(data_cmd_ixf_dismissals.json) @@ -423,6 +474,129 @@ def entities(): return entities +@pytest.fixture +def entities_base(): + entities = {} + with reversion.create_revision(): + entities["org"] = [Organization.objects.create(name="Netflix", status="ok")] + + # create exchange(s) + entities["ix"] = [ + InternetExchange.objects.create( + name="Test Exchange One", + org=entities["org"][0], + status="ok", + tech_email="ix1@localhost", + ), + InternetExchange.objects.create( + name="Test Exchange Two", + org=entities["org"][0], + status="ok", + tech_email="ix2@localhost", + ), + ] + + # create ixlan(s) + entities["ixlan"] = [ix.ixlan for ix in entities["ix"]] + + # create ixlan prefix(s) + entities["ixpfx"] = [ + IXLanPrefix.objects.create( + ixlan=entities["ixlan"][0], + status="ok", + prefix="195.69.144.0/22", + protocol="IPv4", + ), + IXLanPrefix.objects.create( + ixlan=entities["ixlan"][0], + status="ok", + prefix="2001:7f8:1::/64", + protocol="IPv6", + ), + IXLanPrefix.objects.create( + ixlan=entities["ixlan"][1], + status="ok", + prefix="195.66.224.0/22", + protocol="IPv4", + ), + IXLanPrefix.objects.create( + ixlan=entities["ixlan"][1], + status="ok", + prefix="2001:7f8:4::/64", + protocol="IPv6", + ), + ] + + # create network(s) + entities["net"] = { + "UPDATE_ENABLED": Network.objects.create( + name="Network w allow ixp update enabled", + org=entities["org"][0], + asn=2906, + info_prefixes4=42, + info_prefixes6=42, + website="http://netflix.com/", + policy_general="Open", + policy_url="https://www.netflix.com/openconnect/", + allow_ixp_update=True, + status="ok", + irr_as_set="AS-NFLX", + info_unicast=True, + info_ipv6=True, + ), + "UPDATE_DISABLED": Network.objects.create( + name="Network w allow ixp update disabled", + org=entities["org"][0], + asn=1001, + allow_ixp_update=False, + status="ok", + info_prefixes4=42, + info_prefixes6=42, + website="http://netflix.com/", + policy_general="Open", + policy_url="https://www.netflix.com/openconnect/", + info_unicast=True, + info_ipv6=True, + ), + "UPDATE_DISABLED_2": Network.objects.create( + name="Network w allow ixp update disabled (2)", + org=entities["org"][0], + asn=1101, + allow_ixp_update=False, + status="ok", + info_prefixes4=42, + info_prefixes6=42, + website="http://netflix.com/", + policy_general="Open", + policy_url="https://www.netflix.com/openconnect/", + info_unicast=True, + info_ipv6=True, + ), + } + + entities["netcontact"] = [ + NetworkContact.objects.create( + email="network1@localhost", + network=entities["net"]["UPDATE_ENABLED"], + status="ok", + role="Policy", + ), + NetworkContact.objects.create( + email="network2@localhost", + network=entities["net"]["UPDATE_DISABLED"], + status="ok", + role="Policy", + ), + ] + entities["netixlan"] = [] + admin_user = User.objects.create_user("admin", "admin@localhost", "admin") + ixf_importer_user = User.objects.create_user( + "ixf_importer", "ixf_importer@localhost", "ixf_importer" + ) + entities["org"][0].admin_usergroup.user_set.add(admin_user) + return entities + + @pytest.fixture def deskprotickets(): """ diff --git a/tests/test_cmd_pdb_delete_childless_org.py b/tests/test_cmd_pdb_delete_childless_org.py new file mode 100644 index 00000000..b08d6b21 --- /dev/null +++ b/tests/test_cmd_pdb_delete_childless_org.py @@ -0,0 +1,49 @@ +import io +from datetime import timedelta + +import pytest +import reversion +from django.conf import settings +from django.core.management import call_command +from django.db.transaction import commit +from django.utils import timezone +from reversion.models import Version + +from peeringdb_server.models import Facility, InternetExchange, Network, Organization + +from .util import ClientCase, Group + + +class TestChildlessDeleteOrg(ClientCase): + @classmethod + def setUpTestData(cls): + super().setUpTestData() + with reversion.create_revision(): + call_command("pdb_generate_test_data", limit=1, commit=True) + cls.org = Organization.objects.first() + + def test_cmd_delete_childless_org(self): + + dt = timezone.now() - timedelta(days=settings.ORG_CHILDLESS_DELETE_DURATION + 1) + + org = self.org + + # Set the date to days before the current date (based on settings.ORG_CHILDLESS_DELETE_DURATION) + org.flagged_date = dt + org.save() + + # delete child objects + net = Network.objects.filter(org=org).delete() + ix = InternetExchange.objects.filter(org=org).delete() + fac = Facility.objects.filter(org=org).delete() + + # Check if org is childless and can be deleted + assert org.deletable + + call_command("pdb_delete_childless_org", commit=True) + + org = Organization.objects.filter(id=org.id).first() + + # Check if org was flagged and deleted + assert org.flagged + assert org.status == "deleted" diff --git a/tests/test_views.py b/tests/test_views.py index 14f600cc..f1446b3e 100644 --- a/tests/test_views.py +++ b/tests/test_views.py @@ -10,6 +10,7 @@ from peeringdb_server.models import ( User, UserOrgAffiliationRequest, ) +from tests.util import reset_group_ids URL = "/affiliate-to-org" @@ -120,6 +121,7 @@ def test_affiliate_to_nonexisting_org_multiple(client): @pytest.mark.django_db def test_adv_search_init(): + reset_group_ids() client = Client() response = client.get("/advanced_search") assert response.status_code == 200 diff --git a/tests/util.py b/tests/util.py index 2276dca1..79ed234d 100644 --- a/tests/util.py +++ b/tests/util.py @@ -89,8 +89,15 @@ def reset_group_ids(): to make sure the settings are updated """ - settings.USER_GROUP_ID = Group.objects.get(name="user").id - settings.GUEST_GROUP_ID = Group.objects.get(name="guest").id + try: + settings.USER_GROUP_ID = Group.objects.get(name="user").id + except Group.DoesNotExist: + Group.objects.create(name="user", id=settings.USER_GROUP_ID) + + try: + settings.GUEST_GROUP_ID = Group.objects.get(name="guest").id + except Group.DoesNotExist: + Group.objects.create(name="guest", id=settings.GUEST_GROUP_ID) def override_group_id():