Beispiel #1
0
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'
Beispiel #2
0
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"
Beispiel #3
0
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'
Beispiel #4
0
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"
Beispiel #5
0
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"
Beispiel #6
0
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"
Beispiel #7
0
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
Beispiel #8
0
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)
Beispiel #9
0
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)
Beispiel #10
0
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
Beispiel #11
0
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)
Beispiel #12
0
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')
Beispiel #13
0
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"
Beispiel #14
0
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)
Beispiel #15
0
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')
Beispiel #16
0
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)
Beispiel #17
0
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"
Beispiel #18
0
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)
Beispiel #19
0
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"
Beispiel #20
0
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'
Beispiel #21
0
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)
Beispiel #22
0
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'
Beispiel #23
0
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'), )
Beispiel #24
0
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"
Beispiel #25
0
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'
Beispiel #26
0
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')
Beispiel #27
0
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'
Beispiel #28
0
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,
        }
Beispiel #29
0
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'
Beispiel #30
0
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()