class Organization(models.Model): # id bigint NOT NULL, id = models.BigAutoField(primary_key = True) # uuid uuid DEFAULT public.gen_random_uuid(), uuid = models.UUIDField(blank = True, null = False) # name character varying, name = models.CharField(max_length = 255, blank = True) # address character varying, address = models.CharField(max_length = 255, blank = True) # phone character varying, phone = models.CharField(max_length = 255, blank = True) # email character varying email = models.CharField(max_length = 255, blank = True) # user_id bigint, user = models.ForeignKey('core_admin.User', models.DO_NOTHING) # user_id = models.BigIntegerField(blank=True, null=True) # created_at timestamp without time zone DEFAULT now() NOT NULL, created_at = models.DateTimeField() # updated_at timestamp without time zone DEFAULT now() NOT NULL, updated_at = models.DateTimeField() class Meta: managed = False db_table = 'organizations' required_db_vendor = 'postgis'
class Lines(models.Model): id = models.BigAutoField(primary_key=True) line = models.GeometryField(srid=0, blank=True, null=True) source_user_id = models.BigIntegerField(blank=True, null=True) class Meta: db_table = "lines"
class User(models.Model): # id bigint NOT NULL, id = models.BigAutoField(primary_key = True) # uuid uuid DEFAULT public.gen_random_uuid(), uuid = models.UUIDField(blank = True, null = False) # name_first character varying, name_first = models.CharField(max_length = 255, blank = True) # name_last character varying, name_last = models.CharField(max_length = 255, blank = True) # nickname character varying, nickname = models.CharField(max_length = 255, blank = True) # avatar_url character varying, avatar_url = models.CharField(max_length = 255, blank = True) # email character varying, email = models.CharField(max_length = 255, blank = True) # created_at timestamp without time zone DEFAULT now() NOT NULL, created_at = models.DateTimeField() # updated_at timestamp without time zone DEFAULT now() NOT NULL, updated_at = models.DateTimeField() # preferences jsonb, preferences = models.JSONField(blank = True) # avatar_image bytea, avatar_image = models.BinaryField(blank = True) # non_user_notification_state jsonb non_user_notification_state = models.JSONField(blank = True) class Meta: managed = False db_table = 'users' required_db_vendor = 'postgis'
class Geoobject(models.Model): id = models.BigAutoField(primary_key=True) name = models.CharField(max_length=255, blank=True, null=True) source_user_id = models.BigIntegerField() class Meta: db_table = "geoobject"
class Polygons(models.Model): id = models.BigAutoField(primary_key=True) polygon = models.GeometryField(srid=4326, blank=True, null=True) source_user_id = models.BigIntegerField(blank=True, null=True) class Meta: db_table = "polygons"
class Classification(models.Model): id = models.BigAutoField(primary_key=True) class_field = models.CharField( db_column="class", max_length=255, blank=True, null=True) # Field renamed because it was a Python reserved word. subclassname = models.CharField(max_length=255, blank=True, null=True) class Meta: db_table = "classification"
class StayPoint(models.Model): id = models.BigAutoField(primary_key=True) location = models.ForeignKey(POI, verbose_name='POI of Stay Point', related_name='stayPointLoc', on_delete=models.CASCADE, db_index=True) start_time = models.DateTimeField(verbose_name='Start time of stay') end_time = models.DateTimeField(verbose_name='End time of stay') def __str__(self): return self.location.name
class ImportProblem(models.Model): id = models.BigAutoField(primary_key=True) root_server = models.ForeignKey(RootServer, on_delete=models.CASCADE) message = models.CharField(max_length=255) timestamp = models.DateTimeField(auto_now=True) data = models.TextField(null=True) def __str__(self): return '({}:{}:{})'.format(self.id, self.root_server if self.root_server else '', self.message)
class Format(CachingMixin, models.Model): id = models.BigAutoField(primary_key=True) source_id = models.BigIntegerField() root_server = models.ForeignKey(RootServer, on_delete=models.CASCADE) type = models.CharField(max_length=7, null=True) world_id = models.CharField(max_length=255, null=True) if settings.CACHE_FORMATS: objects = CachingManager() @staticmethod def import_from_bmlt_objects(root_server, bmlt_formats): logger = logging.getLogger('django') try: format_ids = [int(fid) for fid in bmlt_formats.keys()] Format.objects.filter(root_server=root_server).exclude(source_id__in=format_ids).delete() except Exception as e: message = 'Error deleting old formats: {}'.format(str(e)) logger.error(message) ImportProblem.objects.create(root_server=root_server, message=message) for bmlt_format in bmlt_formats.values(): bmlt_translated_formats = list(bmlt_format.values()) try: bmlt_format = Format.validate_bmlt_object(root_server, bmlt_translated_formats[0]) except ImportException as e: logger.warning('Error parsing format: {}'.format(str(e))) ImportProblem.objects.create(root_server=root_server, message=str(e), data=str(e.bmlt_object)) continue format = Format.objects.get_or_create(root_server=root_server, source_id=bmlt_format['source_id'])[0] dirty = False field_names = ('type', 'world_id') changed_fields = [] for field_name in field_names: if set_if_changed(format, field_name, bmlt_format[field_name]): changed_fields.append(field_name) dirty = True if dirty: format.save() TranslatedFormat.import_from_bmlt_objects(root_server, bmlt_translated_formats) @staticmethod def validate_bmlt_object(root_server, bmlt): return { 'source_id': get_int(bmlt, 'id'), 'type': bmlt.get('format_type_enum', None), 'world_id': bmlt.get('world_id', None), } def __str__(self): return '({}:{})'.format(self.id, self.root_server)
class Trace(models.Model): id = models.BigAutoField(primary_key=True) user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='User', db_index=True, related_name='userTrace') points = models.TextField(verbose_name='Points of trace') start_time = models.DateTimeField(verbose_name='Start time of trace') end_time = models.DateTimeField(verbose_name='End time of trace') def __str__(self): return self.points
class Format(models.Model): id = models.BigAutoField(primary_key=True) source_id = models.BigIntegerField() root_server = models.ForeignKey(RootServer, on_delete=models.CASCADE) key_string = models.CharField(max_length=255) name = models.CharField(max_length=255) description = models.TextField(null=True) language = models.CharField(max_length=7, default='en') world_id = models.CharField(max_length=255, null=True) @staticmethod def import_from_bmlt_objects(root_server, bmlt_formats): logger = logging.getLogger('django') try: format_ids = [int(f['id']) for f in bmlt_formats] Format.objects.filter(root_server=root_server).exclude(source_id__in=format_ids).delete() except Exception as e: message = 'Error deleting old formats: {}'.format(str(e)) logger.error(message) ImportProblem.objects.create(root_server=root_server, message=message) for bmlt_format in bmlt_formats: try: bmlt_format = Format.validate_bmlt_object(root_server, bmlt_format) except ImportException as e: logger.warning('Error parsing format: {}'.format(str(e))) ImportProblem.objects.create(root_server=root_server, message=str(e), data=str(e.bmlt_object)) continue format = Format.objects.get_or_create(root_server=root_server, source_id=bmlt_format['source_id'])[0] dirty = False field_names = ('key_string', 'name', 'description', 'language', 'world_id') changed_fields = [] for field_name in field_names: if set_if_changed(format, field_name, bmlt_format[field_name]): changed_fields.append(field_name) dirty = True if dirty: format.save() @staticmethod def validate_bmlt_object(root_server, bmlt): return { 'source_id': get_int(bmlt, 'id'), 'key_string': get_required_str(bmlt, 'key_string'), 'name': get_required_str(bmlt, 'name_string'), 'description': bmlt.get('description_string', None), 'language': bmlt.get('lang'), 'world_id': bmlt.get('world_id', None), } def __str__(self): return '({}:{}:{}:{})'.format(self.id, self.root_server, self.key_string, self.name)
class Measure(models.Model): id = models.BigAutoField(primary_key=True) serie = models.ForeignKey(Serie, on_delete=models.CASCADE) timestamp = models.DateTimeField(db_index=True) value = models.FloatField() objects = models.Manager() extra = PostgresManager() class Meta: unique_together = ('serie', 'timestamp') #, 'value')
class PlanetOsmWays(models.Model): id = models.BigAutoField(primary_key=True) osm_id = models.BigIntegerField() version = models.IntegerField() visible = models.BooleanField() way = models.LineStringField(srid=3857, blank=True, null=True) timestamp = models.DateField(blank=True, null=True) tags = HStoreField(default=dict) class Meta: db_table = "planet_osm_ways"
class OsmNodes(models.Model): node_id = models.BigAutoField(primary_key=True) osm_id = models.BigIntegerField(unique=True, blank=True, null=True) lon = models.DecimalField(max_digits=11, decimal_places=8, blank=True, null=True) lat = models.DecimalField(max_digits=11, decimal_places=8, blank=True, null=True) numofuse = models.IntegerField(blank=True, null=True)
class ParkingLocationSnapshot(models.Model): id = models.BigAutoField(primary_key=True, unique=True) scraped_at = models.DateTimeField(auto_now_add=True, editable=False, db_index=True) data = JSONField() objects = ParkingLocationSnapshotManager() class Meta: db_table = 'parkinglocation_raw' ordering = ('scraped_at', 'id')
class RootServer(models.Model): id = models.BigAutoField(primary_key=True) name = models.CharField(max_length=255, null=True) url = models.URLField() server_info = models.TextField(null=True) last_successful_import = models.DateTimeField(null=True) num_areas = models.IntegerField(default=0) num_regions = models.IntegerField(default=0) num_meetings = models.IntegerField(default=0) def __str__(self): return '({}:{}:{})'.format(self.id, self.url, self.last_successful_import)
class PlanetOsmRels(models.Model): id = models.BigAutoField(primary_key=True) osm_id = models.BigIntegerField() version = models.IntegerField() visible = models.BooleanField() tags = HStoreField(default=dict) timestamp = models.DateField(blank=True, null=True) inner_members = ArrayField(models.BigIntegerField(), default=list) outer_members = ArrayField(models.BigIntegerField(), default=list) rel_type = models.CharField(max_length=256, blank=True, null=True) class Meta: db_table = "planet_osm_rels"
class StopUsageUsage(models.Model): id = models.BigAutoField(primary_key=True) journey = models.ForeignKey(Journey, models.CASCADE) stop = models.ForeignKey(StopPoint, models.CASCADE) datetime = models.DateTimeField() order = models.PositiveIntegerField() class Meta(): ordering = ('datetime',) index_together = ( ('stop', 'datetime'), ) def __str__(self): return '{} {}'.format(self.stop, self.datetime)
class GeoobjectGeometry(models.Model): id = models.BigAutoField(primary_key=True) id_target = models.BigIntegerField(blank=True, null=True) type_target = models.IntegerField(blank=True, null=True) id_geoobject_source = models.BigIntegerField() role = models.CharField(max_length=255, blank=True, null=True) classification_id = models.BigIntegerField() tags = HStoreField(blank=True, null=True) valid_since = models.DateField() valid_until = models.DateField() valid_since_offset = models.BigIntegerField(blank=True, null=True) valid_until_offset = models.BigIntegerField(blank=True, null=True) source_user_id = models.BigIntegerField(blank=True, null=True) class Meta: db_table = "geoobject_geometry"
class OsmNodes(models.Model): node_id = models.BigAutoField(primary_key=True) osm_id = models.BigIntegerField(unique=True, blank=True, null=True) lon = models.DecimalField(max_digits=11, decimal_places=8, blank=True, null=True) lat = models.DecimalField(max_digits=11, decimal_places=8, blank=True, null=True) numofuse = models.IntegerField(blank=True, null=True) the_geom = models.PointField(blank=True, null=True) class Meta: managed = False db_table = 'osm_nodes'
class MeetingInfo(models.Model): id = models.BigAutoField(primary_key=True) meeting = models.OneToOneField(Meeting, on_delete=models.CASCADE) email = models.EmailField(null=True) location_text = models.CharField(max_length=255, null=True) location_info = models.CharField(max_length=255, null=True) location_street = models.CharField(max_length=255, null=True) location_city_subsection = models.CharField(max_length=255, null=True) location_neighborhood = models.CharField(max_length=255, null=True) location_municipality = models.CharField(max_length=255, null=True) location_sub_province = models.CharField(max_length=255, null=True) location_province = models.CharField(max_length=255, null=True) location_postal_code_1 = models.CharField(max_length=255, null=True) location_nation = models.CharField(max_length=255, null=True) train_lines = models.CharField(max_length=255, null=True) bus_lines = models.TextField(max_length=512, null=True) world_id = models.CharField(max_length=255, null=True) comments = models.TextField(null=True)
class Ways(models.Model): """ Edges in the road network graph. """ gid = models.BigAutoField(primary_key=True) class_field = models.ForeignKey( OsmWayClasses, models.DO_NOTHING, db_column='class_id' ) # Field renamed because it was a Python reserved word. length = models.FloatField(blank=True, null=True) length_m = models.FloatField(blank=True, null=True) name = models.TextField(blank=True, null=True) source = models.ForeignKey('WaysVerticesPgr', models.DO_NOTHING, db_column='source', related_name='ways_source_set', blank=True, null=True) target = models.ForeignKey('WaysVerticesPgr', models.DO_NOTHING, db_column='target', related_name='ways_target_set', blank=True, null=True) x1 = models.FloatField(blank=True, null=True) y1 = models.FloatField(blank=True, null=True) x2 = models.FloatField(blank=True, null=True) y2 = models.FloatField(blank=True, null=True) cost = models.FloatField(blank=True, null=True) reverse_cost = models.FloatField(blank=True, null=True) cost_s = models.FloatField(blank=True, null=True) reverse_cost_s = models.FloatField(blank=True, null=True) rule = models.TextField(blank=True, null=True) one_way = models.IntegerField(blank=True, null=True) maxspeed_forward = models.IntegerField(blank=True, null=True) maxspeed_backward = models.IntegerField(blank=True, null=True) osm_id = models.BigIntegerField(blank=True, null=True) source_osm = models.BigIntegerField(blank=True, null=True) target_osm = models.BigIntegerField(blank=True, null=True) priority = models.FloatField(blank=True, null=True) the_geom = models.LineStringField(blank=True, null=True) class Meta: managed = False db_table = 'ways'
class StopTime(models.Model): id = models.BigAutoField(primary_key=True) trip = models.ForeignKey(Trip, models.CASCADE) stop_code = models.CharField(max_length=255, blank=True) stop = models.ForeignKey('busstops.StopPoint', models.SET_NULL, null=True, blank=True) arrival = models.DurationField() departure = models.DurationField() sequence = models.PositiveSmallIntegerField() timing_status = models.CharField(max_length=3, blank=True) activity = models.CharField(max_length=16, blank=True) def get_key(self): return self.stop_id or self.stop_code class Meta: ordering = ('sequence', ) index_together = (('stop', 'departure'), )
class Subscription(models.Model): # id bigint NOT NULL id = models.BigAutoField(primary_key=True) # organization_id integer NOT NULL organization = models.ForeignKey('core_admin.Organization', models.DO_NOTHING) # aoi jsonb NOT NULL aoi = models.JSONField(blank=True, null=True) # starts_at timestamp without time zone DEFAULT now() NOT NULL starts_at = models.DateTimeField() # ends_at timestamp without time zone, ends_at = models.DateTimeField(blank=True, null=True) # created_at timestamp without time zone DEFAULT now() NOT NULL, created_at = models.DateTimeField() # updated_at timestamp without time zone DEFAULT now() NOT NULL, updated_at = models.DateTimeField() class Meta: managed = False db_table = 'subscriptions' verbose_name_plural = "Subscriptions"
class Ways(models.Model): gid = models.BigAutoField(primary_key=True) class_field = models.ForeignKey(OsmWayClasses, models.DO_NOTHING, db_column='class_id') # Field renamed because it was a Python reserved word. length = models.FloatField(blank=True, null=True) length_m = models.FloatField(blank=True, null=True) name = models.TextField(blank=True, null=True) x1 = models.FloatField(blank=True, null=True) y1 = models.FloatField(blank=True, null=True) x2 = models.FloatField(blank=True, null=True) y2 = models.FloatField(blank=True, null=True) osm_id = models.BigIntegerField(blank=True, null=True) source_osm = models.BigIntegerField(blank=True, null=True) target_osm = models.BigIntegerField(blank=True, null=True) priority = models.FloatField(blank=True, null=True) the_geom = models.LineStringField(blank=True, null=True) class Meta: managed = False db_table = 'ways'
class OvFiets(models.Model): id = models.BigAutoField(primary_key=True, unique=True) name = models.CharField(max_length=250) description = models.TextField(null=True, blank=True) station_code = models.CharField(max_length=4, null=True, blank=True) location_code = models.CharField(max_length=7, blank=True) open = models.CharField(max_length=7) geometrie = models.PointField(name="geometrie", srid=WGS84_SRID, null=True) rental_bikes = models.IntegerField(null=True, blank=True) fetch_time = models.DateTimeField(db_index=True) opening_hours = JSONField(null=True, blank=True) unmapped = JSONField(null=True, blank=True) stadsdeel = models.CharField(max_length=4, null=True) buurt_code = models.CharField(max_length=5, null=True) scraped_at = models.DateTimeField(db_index=True) class Meta: db_table = 'importer_ovfiets' ordering = ('location_code', 'id')
class StopTime(models.Model): id = models.BigAutoField(primary_key=True) trip = models.ForeignKey(Trip, models.CASCADE) stop_code = models.CharField(max_length=255, blank=True) stop = models.ForeignKey('busstops.StopPoint', models.SET_NULL, null=True, blank=True) arrival = SecondsField(null=True, blank=True) departure = SecondsField(null=True, blank=True) sequence = models.PositiveSmallIntegerField() timing_status = models.CharField(max_length=3, blank=True) activity = models.CharField(max_length=16, blank=True) pick_up = models.BooleanField(default=True) set_down = models.BooleanField(default=True) def get_key(self): return self.stop_id or self.stop_code class Meta: ordering = ('sequence',) index_together = ( ('stop', 'departure'), ) def arrival_or_departure(self): if self.arrival is not None: return self.arrival return self.departure def departure_or_arrival(self): if self.departure is not None: return self.departure return self.arrival def arrival_time(self): return format_timedelta(self.arrival) def departure_time(self): return format_timedelta(self.departure) def is_minor(self): return self.timing_status == 'OTH'
class Shop(models.Model): '''Physical places where the products of our application are sold''' # Long integers are required from the specification id = models.BigAutoField(primary_key=True) name = models.CharField(max_length=255) address = models.CharField(max_length=255) # We will use GeoDjango for storing and querying spatial data # https://docs.djangoproject.com/en/2.1/ref/contrib/gis/ # geography=True will enable distance lookups that use metric # https://docs.djangoproject.com/en/2.1/ref/contrib/gis/model-api/#geography # # NOTE: If the field is set via Python and the Point model is used, # the syntax is Point(longitude, latitude). coordinates = models.PointField(geography=True, validators=[coordinates_validator]) withdrawn = models.BooleanField(default=False) tags = models.ManyToManyField(ShopTag) objects = ShopManager() def __str__(self): return self.name + (' (withdrawn)' if self.withdrawn else '') def __serialize__(self): return { 'id': self.id, 'name': self.name, 'address': self.address, 'lng': self.coordinates.x, 'lat': self.coordinates.y, 'tags': self.tags.all(), 'withdrawn': self.withdrawn, }
class WaysVerticesPgr(models.Model): """ Vertices in the road network graph. """ id = models.BigAutoField(primary_key=True) osm_id = models.BigIntegerField(unique=True, blank=True, null=True) cnt = models.IntegerField(blank=True, null=True) chk = models.IntegerField(blank=True, null=True) ein = models.IntegerField(blank=True, null=True) eout = models.IntegerField(blank=True, null=True) lon = models.DecimalField(max_digits=11, decimal_places=8, blank=True, null=True) lat = models.DecimalField(max_digits=11, decimal_places=8, blank=True, null=True) the_geom = models.PointField(blank=True, null=True) class Meta: managed = False db_table = 'ways_vertices_pgr'
class AssetUpload(models.Model): class Meta: constraints = [ models.UniqueConstraint(fields=['asset', 'upload_id'], name='unique_together'), # Make sure that there is only one asset upload in progress per asset models.UniqueConstraint(fields=['asset', 'status'], condition=Q(status='in-progress'), name='unique_in_progress') ] class Status(models.TextChoices): # pylint: disable=invalid-name IN_PROGRESS = 'in-progress' COMPLETED = 'completed' ABORTED = 'aborted' __empty__ = '' # using BigIntegerField as primary_key to deal with the expected large number of assets. id = models.BigAutoField(primary_key=True) asset = models.ForeignKey(Asset, related_name='+', on_delete=models.CASCADE) upload_id = models.CharField(max_length=255, blank=False, null=False) status = models.CharField(choices=Status.choices, max_length=32, default=Status.IN_PROGRESS, blank=False, null=False) number_parts = models.IntegerField( validators=[MinValueValidator(1), MaxValueValidator(100)], null=False, blank=False) # S3 doesn't support more that 10'000 parts md5_parts = models.JSONField(encoder=DjangoJSONEncoder, editable=False) urls = models.JSONField(default=list, encoder=DjangoJSONEncoder, blank=True) created = models.DateTimeField(auto_now_add=True) ended = models.DateTimeField(blank=True, null=True, default=None) checksum_multihash = models.CharField(max_length=255, blank=False, null=False) # NOTE: hidden ETag field, this field is automatically updated by stac_api.pgtriggers etag = models.CharField(blank=False, null=False, max_length=56, default=compute_etag) # Custom Manager that preselects the collection objects = AssetUploadManager() def update_asset_checksum_multihash(self): '''Updating the asset's checksum:multihash from the upload When the upload is completed, the new checksum:multihash from the upload is set to its asset parent. ''' logger.debug( 'Updating asset %s checksum:multihash from %s to %s due to upload complete', self.asset.name, self.asset.checksum_multihash, self.checksum_multihash, extra={ 'upload_id': self.upload_id, 'asset': self.asset.name, 'item': self.asset.item.name, 'collection': self.asset.item.collection.name }) self.asset.checksum_multihash = self.checksum_multihash self.asset.save()