class Version(Model): name = CharField(max_length=128) description = CharField(max_length=1024, blank=True) number = PositiveIntegerField() project = ForeignKey(Project, on_delete=CASCADE) created_datetime = DateTimeField(auto_now_add=True, null=True, blank=True) created_by = ForeignKey(User, on_delete=SET_NULL, null=True, blank=True, related_name='version_created_by') show_empty = BooleanField(default=True) """ Tells the UI to show this version even if the current media does not have any annotations. """ bases = ManyToManyField('self', symmetrical=False, blank=True) """ This version is a patch to an existing version. A use-case here is using one version for each generation of a state-based inference algorithm; all referencing localizations in another layer. """ def __str__(self): out = f"{self.name}" if self.description: out += f" | {self.description}" return out
class Bookmark(Model): """ Stores a link saved by a user. """ project = ForeignKey(Project, on_delete=CASCADE, db_column='project') user = ForeignKey(User, on_delete=CASCADE, db_column='user') name = CharField(max_length=128) uri = CharField(max_length=1024)
class Membership(Model): """Stores a user and their access level for a project. """ project = ForeignKey(Project, on_delete=CASCADE) user = ForeignKey(User, on_delete=CASCADE) permission = EnumField(Permission, max_length=1, default=Permission.CAN_EDIT) def __str__(self): return f'{self.user} | {self.permission} | {self.project}'
class Favorite(Model): """ Stores an annotation saved by a user. """ project = ForeignKey(Project, on_delete=CASCADE, db_column='project') user = ForeignKey(User, on_delete=CASCADE, db_column='user') meta = ForeignKey(LocalizationType, on_delete=CASCADE, db_column='meta') name = CharField(max_length=128) page = PositiveIntegerField(default=1) values = JSONField()
class Analysis2D(AnalysisBase): data_type = ForeignKey(EntityTypeBase, on_delete=CASCADE) data_filter = JSONField(null=True, blank=True) attribute_x = ForeignKey(AttributeTypeBase, on_delete=CASCADE, related_name='attribute_x') attribute_y = ForeignKey(AttributeTypeBase, on_delete=CASCADE, related_name='attribute_y') plot_type = EnumField(TwoDPlotType)
class EntityLocalizationBase(EntityBase): user = ForeignKey(User, on_delete=PROTECT) media = ForeignKey(EntityMediaBase, on_delete=CASCADE) frame = PositiveIntegerField(null=True) thumbnail_image = ForeignKey(EntityMediaImage, on_delete=SET_NULL, null=True,blank=True, related_name='thumbnail_image') def selectOnMedia(media_id): return EntityLocalizationBase.objects.filter(media=media_id)
class Affiliation(Model): """Stores a user and their permissions in an organization. """ organization = ForeignKey(Organization, on_delete=CASCADE) user = ForeignKey(User, on_delete=CASCADE) permission = CharField(max_length=16, choices=[('Member', 'Member'), ('Admin', 'Admin')], default='Member') def __str__(self): return f'{self.user} | {self.organization}'
class EntityBase(PolymorphicModel): project = ForeignKey(Project, on_delete=CASCADE, null=True, blank=True) meta = ForeignKey(EntityTypeBase, on_delete=CASCADE) """ Meta points to the defintion of the attribute field. That is a handful of AttributeTypes are associated to a given EntityType that is pointed to by this value. That set describes the `attribute` field of this structure. """ attributes = JSONField(null=True, blank=True) """ The attributes related to this entity, see `meta` for column definitions """ related_media = ForeignKey('EntityBase', on_delete=SET_NULL, null=True, blank=True)
class UserFavoriteLayer(Model): """ Created when a layer is "starred" and destroyed when that layer is "un-starred". Users may "star" their own layers or published layers. """ user = ForeignKey(User) layer = ForeignKey(Layer, related_name='favorites') created_at = DateTimeField(auto_now_add=True) def __unicode__(self): return '{0} -> {1}'.format(self.user.username, self.layer.name)
class AlgorithmResult(Model): algorithm = ForeignKey(Algorithm, on_delete=CASCADE) user = ForeignKey(User, on_delete=CASCADE) media = ManyToManyField(EntityMediaBase) started = DateTimeField() stopped = DateTimeField() result = EnumField(JobResult) message = CharField(max_length=128) setup_log = FileField(null=True, blank=True) algorithm_log = FileField(null=True, blank=True) teardown_log = FileField(null=True, blank=True) def __str__(self): return f"{self.algorithm.name}, {self.result}, started {self.started}"
class AttributeTypeBase(PolymorphicModel): """ Generic entity in a JSON-B field. """ name = CharField(max_length=64) """ Name refers to the key in the JSON structure """ description = CharField(max_length=256, blank=True) """ Human readable description of the column """ applies_to = ForeignKey(EntityTypeBase, on_delete=CASCADE) """ Pointer to the owner of this type description. Either a media, state or sequence 'owns' this type and combines it into a set with other AttributeTypes to describe an AttributeSet """ project = ForeignKey(Project, on_delete=CASCADE) order = IntegerField(default=0) """ Controls order (lower numbers first, negative is hide) """ def __str__(self): return self.name
class TemporaryFile(Model): """ Represents a temporary file in the system, can be used for algorithm results or temporary outputs """ name = CharField(max_length=128) """ Human readable name for display purposes """ project = ForeignKey(Project, on_delete=CASCADE) """ Project the temporary file resides in """ user = ForeignKey(User, on_delete=PROTECT) """ User who created the temporary file """ path = FilePathField(path=settings.MEDIA_ROOT, null=True, blank=True) """ Path to file on storage """ lookup = SlugField(max_length=32) """ unique lookup (md5sum of something useful) """ created_datetime = DateTimeField() """ Time that the file was created """ eol_datetime = DateTimeField() """ Time the file expires (reaches EoL) """ def expire(self): """ Set a given temporary file as expired """ past = datetime.datetime.utcnow() - datetime.timedelta(hours=1) past = pytz.timezone("UTC").localize(past) self.eol_datetime = past self.save() def from_local(path, name, project, user, lookup, hours, is_upload=False): """ Given a local file create a temporary file storage object :returns A saved TemporaryFile: """ extension = os.path.splitext(name)[-1] destination_fp = os.path.join(settings.MEDIA_ROOT, f"{project.id}", f"{uuid.uuid1()}{extension}") os.makedirs(os.path.dirname(destination_fp), exist_ok=True) if is_upload: download_uploaded_file(path, user, destination_fp) else: shutil.copyfile(path, destination_fp) now = datetime.datetime.utcnow() eol = now + datetime.timedelta(hours=hours) temp_file = TemporaryFile(name=name, project=project, user=user, path=destination_fp, lookup=lookup, created_datetime=now, eol_datetime=eol) temp_file.save() return temp_file
class Project(Model): name = CharField(max_length=128) creator = ForeignKey(User, on_delete=PROTECT, related_name='creator', db_column='creator') organization = ForeignKey(Organization, on_delete=SET_NULL, null=True, blank=True, db_column='organization') created = DateTimeField(auto_now_add=True) size = BigIntegerField(default=0) """Size of all media in project in bytes. """ num_files = IntegerField(default=0) duration = BigIntegerField(default=0) """ Duration of all videos in this project. """ summary = CharField(max_length=1024) filter_autocomplete = JSONField(null=True, blank=True) attribute_type_uuids = JSONField(default=dict, null=True, blank=True) enable_downloads = BooleanField(default=True) thumb = CharField(max_length=1024, null=True, blank=True) usernames = ArrayField(CharField(max_length=256), default=list) """ Mapping between attribute type names and UUIDs. Used internally for maintaining elasticsearch field aliases. """ def has_user(self, user_id): return self.membership_set.filter(user_id=user_id).exists() def user_permission(self, user_id): permission = None qs = self.membership_set.filter(user_id=user_id) if qs.exists(): permission = qs[0].permission return permission def __str__(self): return self.name def delete(self, *args, **kwargs): Version.objects.filter(project=self).delete() MediaType.objects.filter(project=self).delete() LocalizationType.objects.filter(project=self).delete() StateType.objects.filter(project=self).delete() LeafType.objects.filter(project=self).delete() super().delete(*args, **kwargs)
class TreeLeaf(EntityBase): parent=ForeignKey('self', on_delete=SET_NULL, blank=True, null=True) path=PathField(unique=True) name = CharField(max_length=255) class Meta: verbose_name_plural = "TreeLeaves" def __str__(self): return str(self.path) def depth(self): return TreeLeaf.objects.annotate(depth=Depth('path')).get(pk=self.pk).depth def subcategories(self, minLevel=1): return TreeLeaf.objects.select_related('parent').filter( path__descendants=self.path, path__depth__gte=self.depth()+minLevel ) def computePath(self): """ Returns the string representing the path element """ pathStr=self.name.replace(" ","_").replace("-","_").replace("(","_").replace(")","_") if self.parent: pathStr=self.parent.computePath()+"."+pathStr elif self.project: projName=self.project.name.replace(" ","_").replace("-","_").replace("(","_").replace(")","_") pathStr=projName+"."+pathStr return pathStr
class EntityState(EntityBase): """ A State is an event that occurs, potentially independent, from that of a media element. It is associated with 0 (1 to be useful) or more media elements. If a frame is supplied it was collected at that time point. """ association = ForeignKey(AssociationType, on_delete=CASCADE) version = ForeignKey(Version, on_delete=CASCADE, null=True, blank=True) modified = BooleanField(null=True, blank=True) """ Indicates whether an annotation is original or modified. null: Original upload, no modifications. false: Original upload, but was modified or deleted. true: Modified since upload or created via web interface. """ def selectOnMedia(media_id): return AssociationType.states(media_id)
class EntityTypeBase(PolymorphicModel): project = ForeignKey(Project, on_delete=CASCADE, null=True, blank=True) name = CharField(max_length=64) description = CharField(max_length=256, blank=True) visible=BooleanField(default=True) def __str__(self): return f'{self.name} | {self.project}'
class CalendarDate(CompanyBoundModel): """This is an exception for Calendar """ EXCEPTION_TYPES = ( ('1', 'Add to service'), ('2', 'Remove from service'), ) service = ForeignKey(Calendar) date = DateField('Date') exception_type = CharField('Exception Type', max_length=1, default='2', choices=EXCEPTION_TYPES) class Meta: verbose_name_plural = "Calendar Dates" def __str__(self): return '%s-%s' % (self.pk, self.date) @property def gtfs_header(self): return 'service_id,date,exception_type' def gtfs_format(self): data = [ ('service_id', self.service.service_id), ('date', self.date.strftime('%Y-%m-%d')), ('exception_type', self.exception_type), ] return OrderedDict(data)
class Project(Model): name = CharField(max_length=128) creator = ForeignKey(User, on_delete=PROTECT, related_name='creator') created = DateTimeField(auto_now_add=True) size = BigIntegerField(default=0) """Size of all media in project in bytes. """ num_files = IntegerField(default=0) summary = CharField(max_length=1024) filter_autocomplete = JSONField(null=True, blank=True) section_order = ArrayField(CharField(max_length=128), default=list) def has_user(self, user_id): return self.membership_set.filter(user_id=user_id).exists() def user_permission(self, user_id): permission = None qs = self.membership_set.filter(user_id=user_id) if qs.exists(): permission = qs[0].permission return permission def __str__(self): return self.name def delete(self, *args, **kwargs): # Delete attribute types AttributeTypeBase.objects.filter(project=self).delete() # Delete entities qs = EntityBase.objects.filter(project=self) delete_polymorphic_qs(qs) # Delete entity types qs = EntityTypeBase.objects.filter(project=self) delete_polymorphic_qs(qs) super().delete(*args, **kwargs)
class Section(Model): """ Stores either a lucene search or raw elasticsearch query. """ project = ForeignKey(Project, on_delete=CASCADE, db_column='project') name = CharField(max_length=128) """ Name of the section. """ lucene_search = CharField(max_length=1024, null=True, blank=True) """ Optional lucene query syntax search string. """ media_bools = JSONField(null=True, blank=True) """ Optional list of elasticsearch boolean queries that should be applied to media. These are applied to the boolean query "filter" list. """ annotation_bools = JSONField(null=True, blank=True) """ Optional list of elasticsearch boolean queries that should be applied to annotations. These are applied to the boolean query "filter" list. """ tator_user_sections = CharField(max_length=128, null=True, blank=True) """ Identifier used to label media that is part of this section via the tator_user_sections attribute. If not set, this search is not scoped to a "folder". """ visible = BooleanField(default=True) """ Whether this section should be displayed in the UI.
class Order(Base): complete = BooleanField(default=False) duration = IntegerField(null=True) # how long it took to process the order edited = BooleanField(default=False) # tells you whether they opened it for editing... not whether any actual edits were made end = DateTimeField(null=True) end_user_timezone = CharField(max_length=20, null=True) map_format = CharField(max_length=20, null=True) open_source = BooleanField(default=False) #is this map open-sourced, such that it can be included in open source training data? start = DateTimeField(auto_now_add=True, null=True) # it will never be null, but have to do this because migration asks for default otherwise style = ForeignKey("MapStyle", null=True, on_delete=SET_NULL) token = CharField(max_length=200, null=True, unique=True) # the random string that's used to find the order in the maps url = URLField(null=True, max_length=1000, unique=True) # URL if started from url or iframe embeded on a webpage def __str__(self): return self.token def d(self): self.delete_map() self.delete() def delete_map(self): rmtree("/home/usrfd/maps/" + self.token) def finish(self): self.complete = True self.end = end = datetime.now().replace(tzinfo=utc) self.duration = (end - self.start).total_seconds() self.save()
class Project(Model): name = CharField(max_length=128) creator = ForeignKey(User, on_delete=PROTECT, related_name='creator') created = DateTimeField(auto_now_add=True) size = BigIntegerField(default=0) """Size of all media in project in bytes. """ num_files = IntegerField(default=0) summary = CharField(max_length=1024) filter_autocomplete = JSONField(null=True, blank=True) def has_user(self, user_id): return self.membership_set.filter(user_id=user_id).exists() def user_permission(self, user_id): permission = None qs = self.membership_set.filter(user_id=user_id) if qs.exists(): permission = qs[0].permission return permission def __str__(self): return self.name def delete(self, *args, **kwargs): Version.objects.filter(project=self).delete() MediaType.objects.filter(project=self).delete() LocalizationType.objects.filter(project=self).delete() StateType.objects.filter(project=self).delete() LeafType.objects.filter(project=self).delete() super().delete(*args, **kwargs)
class Analysis(Model): project = ForeignKey(Project, on_delete=CASCADE, db_column='project') name = CharField(max_length=64) data_query = CharField(max_length=1024, default='*') def __str__(self): return f"{self.project} | {self.name}"
class BaseOfferModel(BaseModel): agent = ForeignKey(UserProfile, on_delete=SET_NULL, null=True) is_published = BooleanField('publicat?', default=False) address = PointField('adresă', max_length=200, null=True) hide_address_on_imobiliare = BooleanField('ascunde adresa în imobiliare.ro', default=False) county = ForeignKey(County, related_name='%(class)ss', related_query_name='%(class)s', on_delete=SET_NULL, null=True, verbose_name='judeţ') locality = ForeignKey(Locality, related_name='%(class)ss', related_query_name='%(class)s', on_delete=SET_NULL, null=True, verbose_name='localitate') sector = CharField('sectorul', max_length=2, blank=True, default=None, choices=Sector.choices) hide_exact_location_on_imobiliare = BooleanField('ascunde localizarea exactă pe imobiliare.ro', default=False) postal_code = CharField('cod poştal', max_length=50, blank=True, default=None) neighborhood = CharField('vecinătăţi', max_length=100, blank=True, default=None) description = TextField('descriere emoţională', default=None, blank=True) class Meta: abstract = True
class EntityLocalizationBase(EntityBase): user = ForeignKey(User, on_delete=PROTECT) media = ForeignKey(EntityMediaBase, on_delete=CASCADE) frame = PositiveIntegerField(null=True) thumbnail_image = ForeignKey(EntityMediaImage, on_delete=SET_NULL, null=True, blank=True, related_name='thumbnail_image') version = ForeignKey(Version, on_delete=CASCADE, null=True, blank=True) modified = BooleanField(null=True, blank=True) """ Indicates whether an annotation is original or modified. null: Original upload, no modifications. false: Original upload, but was modified or deleted. true: Modified since upload or created via web interface. """ def selectOnMedia(media_id): return EntityLocalizationBase.objects.filter(media=media_id)
class MediaType(Model): dtype = CharField(max_length=16, choices=[('image', 'image'), ('video', 'video'), ('multi', 'multi')]) project = ForeignKey(Project, on_delete=CASCADE, null=True, blank=True, db_column='project') name = CharField(max_length=64) description = CharField(max_length=256, blank=True) visible = BooleanField(default=True) """ Whether this type should be displayed in the UI.""" editTriggers = JSONField(null=True, blank=True) file_format = CharField(max_length=4, null=True, blank=True, default=None) keep_original = BooleanField(default=True, null=True, blank=True) default_volume = IntegerField(default=0) """ Default Volume for Videos (default is muted) """ attribute_types = JSONField(default=list, null=True, blank=True) """ User defined attributes. An array of objects, each containing the following fields: name: Name of the attribute. description: (optional) Description of the attribute. order: Order that the attribute should appear in web UI. Negative means do not display. dtype: Data type of the attribute. Valid values are bool, int, float, string, enum, datetime, geopos. default: (optional) Default value. Valid for all dtypes except datetime. The type should correspond to the dtype (string/enum are strings, int/float are numbers, geopos is a [lon, lat] list). minimum: (optional) Minimum value. Valid for int and float dtypes. maximum: (optional) Maximum value. Valid for int and float dtypes. choices: (optional) Available choices for enum dtype. labels: (optional) Labels for available choices for enum dtype. autocomplete: (optional) Object of the form {'serviceUrl': '<url>'} that specifies URL of the autocomplete service. Valid for string dtype only. use_current: (optional) Boolean indicating whether to use the current time as the default for datetime dtype. """ archive_config = JSONField(default=None, null=True, blank=True) streaming_config = JSONField(default=None, null=True, blank=True) overlay_config = JSONField(default=None, null=True, blank=True) """ Overlay configuration provides text overlay on video / image based on configruation examples: Example: {"mode": "constant", "source": "name"} Overlays file name Time example: {"mode": "datetime", "locale": [locale], "options" : [options]} options can contain 'timeZone' which comes from the TZ database name https://en.wikipedia.org/wiki/List_of_tz_database_time_zones Example: America/Los_Angeles or America/New_York """ def __str__(self): return f'{self.name} | {self.project}'
class CompanyBoundModel(Model): company = ForeignKey('people.Company') class Meta: abstract = True @property def gtfs_header(self): raise NotImplementedError("Please Implement this property")
class Algorithm(Model): name = CharField(max_length=128) project = ForeignKey(Project, on_delete=CASCADE) user = ForeignKey(User, on_delete=PROTECT) description = CharField(max_length=1024, null=True, blank=True) manifest = FileField(upload_to=ProjectBasedFileLocation, null=True, blank=True) cluster = ForeignKey(JobCluster, null=True, blank=True, on_delete=SET_NULL) files_per_job = PositiveIntegerField( default=1, validators=[MinValueValidator(1),] ) max_concurrent = PositiveIntegerField( default=1, validators=[MinValueValidator(1),] ) def __str__(self): return self.name
class JobCluster(Model): name = CharField(max_length=128) owner = ForeignKey(User, null=True, blank=True, on_delete=SET_NULL) host = CharField(max_length=1024) port = PositiveIntegerField() token = CharField(max_length=1024) cert = TextField(max_length=2048) def __str__(self): return self.name
class LayerTag(Model): """ Arbitrary value used to describe a layer which may be used to discover similar layers with tags in common. """ layer = ForeignKey(Layer, related_name='layer_tags') name = CharField(max_length=24) def to_json(self): return self.name
class EntityState(EntityBase): """ A State is an event that occurs, potentially independent, from that of a media element. It is associated with 0 (1 to be useful) or more media elements. If a frame is supplied it was collected at that time point. """ association = ForeignKey(AssociationType, on_delete=CASCADE) def selectOnMedia(media_id): return AssociationType.states(media_id)