Skip to content

Instantly share code, notes, and snippets.

@zlavergne
Last active June 18, 2019 01:05
Show Gist options
  • Save zlavergne/c55908365e4992bfb03b6bcca82bb979 to your computer and use it in GitHub Desktop.
Save zlavergne/c55908365e4992bfb03b6bcca82bb979 to your computer and use it in GitHub Desktop.
# Secondary table defining many-to-many join for private projects that only defined users can map on
project_allowed_users = db.Table(
'project_allowed_users',
db.metadata,
db.Column('project_id', db.Integer, db.ForeignKey('projects.id')),
db.Column('user_id', db.BigInteger, db.ForeignKey('users.id'))
)
class ProjectTeams(db.Model):
__tablename__ = 'project_teams'
team_id = db.Column(db.Integer, db.ForeignKey('teams.id'), primary_key=True)
project_id = db.Column(db.Integer, db.ForeignKey('projects.id'), primary_key=True)
role = db.Column(db.Integer, nullable=False)
project = db.relationship('Project', backref='teams')
team = db.relationship(Team, backref='projects')
# cache mapper counts for 30 seconds
active_mappers_cache = TTLCache(maxsize=1024, ttl=30)
class Project(db.Model):
""" Describes a HOT Mapping Project """
__tablename__ = 'projects'
# Columns
id = db.Column(db.Integer, primary_key=True)
status = db.Column(db.Integer, default=ProjectStatus.DRAFT.value, nullable=False)
created = db.Column(db.DateTime, default=timestamp, nullable=False)
priority = db.Column(db.Integer, default=ProjectPriority.MEDIUM.value)
default_locale = db.Column(db.String(10),
default='en') # The locale that is returned if requested locale not available
author_id = db.Column(db.BigInteger, db.ForeignKey('users.id', name='fk_users'), nullable=False)
mapper_level = db.Column(db.Integer, default=1, nullable=False, index=True) # Mapper level project is suitable for
enforce_mapper_level = db.Column(db.Boolean, default=False)
enforce_validator_role = db.Column(db.Boolean, default=False) # Means only users with validator role can validate
private = db.Column(db.Boolean, default=False) # Only allowed users can validate
entities_to_map = db.Column(db.String)
changeset_comment = db.Column(db.String)
due_date = db.Column(db.DateTime)
imagery = db.Column(db.String)
josm_preset = db.Column(db.String)
last_updated = db.Column(db.DateTime, default=timestamp)
license_id = db.Column(db.Integer, db.ForeignKey('licenses.id', name='fk_licenses'))
geometry = db.Column(Geometry('MULTIPOLYGON', srid=4326))
centroid = db.Column(Geometry('POINT', srid=4326))
task_creation_mode = db.Column(db.Integer, default=TaskCreationMode.GRID.value, nullable=False)
organisation_id = db.Column(db.Integer, db.ForeignKey('organisations.id', name='fk_organisations'), index=True)
# Tags
mapping_types = db.Column(ARRAY(db.Integer), index=True)
campaign_tag = db.Column(db.String, index=True)
# Stats
total_tasks = db.Column(db.Integer, nullable=False)
tasks_mapped = db.Column(db.Integer, default=0, nullable=False)
tasks_validated = db.Column(db.Integer, default=0, nullable=False)
tasks_bad_imagery = db.Column(db.Integer, default=0, nullable=False)
# Mapped Objects
tasks = db.relationship(Task, backref='projects', cascade="all, delete, delete-orphan", lazy='dynamic')
project_info = db.relationship(ProjectInfo, lazy='dynamic', cascade='all')
author = db.relationship(User)
allowed_users = db.relationship(User, secondary=project_allowed_users)
priority_areas = db.relationship(PriorityArea, secondary=project_priority_areas, cascade="all, delete-orphan",
single_parent=True)
organisation = db.relationship(Organisation, backref='projects')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment