class LogEntry(db.Model): id = db.Column(db.Integer, primary_key=True) timestamp = db.Column(db.String(30)) message = db.Column(db.String(140)) user_id = db.Column(db.Integer, db.ForeignKey('user.id')) def __init__(self, message): self.message = message self.timestamp = strftime("%d-%m-%Y %H:%M:%S") self.user_id = 1
class Venue(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(60)) latitude = db.Column(db.Float, default=51.508530) longitude = db.Column(db.Float, default=-0.076132) venueevents = db.relationship('Event', backref='venue', lazy='dynamic') def __init__(self, name, latitude=51.509, longitude=-0.076): self.name = name self.latitude = latitude self.longitude = longitude
class Dance(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(60)) possibletags = db.relationship('Tag', backref='dance', lazy='dynamic') # danceevents = db.relationship('Event', backref='dances', lazy='dynamic') def __init__(self, name): self.name = name def hastags(self): if self.possibletags.count(): return True return False
class Tag(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(20)) color = db.Column(db.Integer) dance_id = db.Column(db.Integer, db.ForeignKey('dance.id')) # taggedevents = db.relationship('Event', backref='tags', lazy='dynamic') def __init__(self, name, dance_id, color=Color.GREY): self.name = name self.color = color.value self.dance_id = dance_id def style(self): color = Color(self.color) return "tagged tag-%s" % color.name.lower()
class User(db.Model): id = db.Column(db.Integer, primary_key=True, autoincrement=True) username = db.Column(db.String(64), unique=True) _password = db.Column(db.String(128)) email = db.Column('email', db.String(50), unique=True, index=True) registered_on = db.Column('registered_on', db.DateTime) active = db.Column('active', db.Boolean) is_promoter = db.Column('is_promoter', db.Boolean, default=False) is_admin = db.Column('is_admin', db.Boolean, default=False) promotesfor = relationship("Promoter", secondary=UserPromoter.__table__, backref="promoterusers") def __init__(self, username="******", password="******", email="default", is_admin=False, is_promoter=False): self.username = username self.password = password self.email = email self.registered_on = datetime.datetime.utcnow() self.active = True self.is_admin = is_admin self.is_promoter = is_promoter @hybrid_property def password(self): return self._password @password.setter def _set_password(self, plaintext): self._password = bcrypt.generate_password_hash(plaintext) def is_correct_password(self, plaintext): return bcrypt.check_password_hash(self._password, plaintext) def get_id(self): return str(self.id) def is_active(self): """True, as all users are active. unless theyve been deactivated""" return self.active def is_authenticated(self): """Return True if the user is authenticated.""" return True #self.authenticated def is_anonymous(self): """False, as anonymous users aren't supported.""" return False def is_admin_user(self): return self.is_admin def is_promoter_user(self): return self.is_promoter def is_valid_promoter_for(self, event): for p in self.promotesfor: if p in event.promoters: return True return False def __repr__(self): return '<User %r>' % (self.username)
class Promoter(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(60)) def __init__(self, name): self.name = name
class Event(db.Model): id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(70)) description = db.Column(db.Text) status = db.Column(db.Integer) venue_id = db.Column(db.Integer, db.ForeignKey('venue.id')) startat = db.Column(db.Time) endat = db.Column(db.Time) date = db.Column(db.Date) day = db.Column(db.Integer) tags = relationship("Tag", secondary=EventTag.__table__, backref="taggedevents") promoters = relationship("Promoter", secondary=EventPromoter.__table__, backref="promoterevents") dances = relationship("Dance", secondary=EventDance.__table__, backref="danceevents") flyerlink = db.Column(db.String(100)) def get_next_date(self): if self.status == 1: return self.date elif self.status == 2: return self.day else: return self.date def __init__(self, title, venue_id, description, startat, endat, day=1, status=1, date=datetime.datetime.utcnow().date()): self.title = title self.description = description self.status = Status.ONE_OFF.value self.venue_id = venue_id self.startat = startat self.endat = endat self.day = day self.date = date self.status = status def getNextDate(self): if self.status == 1: return self.date elif self.status == 2: today = datetime.datetime.today().weekday() + 1 inc = (self.day - today) % 7 nextdate = datetime.datetime.utcnow() + datetime.timedelta( days=inc) return nextdate.date() else: return self.date def setFlyerLink(self, file): msg = '' # if user does not select file, browser also # submit a empty part without filename if file.filename == '': msg = ('No selected file') # return redirect(request.url) if file and allowed_file(file.filename): filename = secure_filename(file.filename) if not os.path.exists( os.path.join(app.config['UPLOAD_FOLDER'], str(self.id))): os.makedirs( os.path.join(app.config['UPLOAD_FOLDER'], str(self.id))) file.save( os.path.join(app.config['UPLOAD_FOLDER'], str(self.id), filename)) # return redirect(url_for('uploaded_file', # filename=filename)) self.flyerlink = os.path.join(app.config['SERVE_FOLDER'], str(self.id), filename) return msg