forked from gergely/calendar-social
Gergely Polonkai
8a46f3c66a
Until now event timestamps were saved in the server’s time zone. Now they are saved in UTC, considering the time zone set by the creator of the event.
101 lines
3.1 KiB
Python
101 lines
3.1 KiB
Python
from datetime import datetime
|
|
|
|
from flask_security import UserMixin, RoleMixin
|
|
from flask_security.utils import hash_password
|
|
from flask_sqlalchemy import SQLAlchemy
|
|
|
|
db = SQLAlchemy()
|
|
users_roles = db.Table(
|
|
'users_roles',
|
|
db.Column('user_id', db.Integer(), db.ForeignKey('users.id')),
|
|
db.Column('role_id', db.Integer(), db.ForeignKey('roles.id')))
|
|
|
|
|
|
class User(db.Model, UserMixin):
|
|
__tablename__ = 'users'
|
|
id = db.Column(db.Integer(), primary_key=True)
|
|
|
|
#: The username of the user. This is also the display name and thus is immutable
|
|
username = db.Column(db.String(length=50), unique=True, nullable=False)
|
|
|
|
#: The email address of the user
|
|
email = db.Column(db.String(length=255), unique=True, nullable=True)
|
|
|
|
#: The (hashed) password of the user
|
|
password = db.Column(db.String(length=255))
|
|
|
|
#: A flag to show whether the user is enabled (active) or not
|
|
active = db.Column(db.Boolean(), default=False)
|
|
|
|
#: The timestamp when this user was created
|
|
created_at = db.Column(db.DateTime(), default=datetime.utcnow)
|
|
|
|
#: The timestamp when the user was activated
|
|
confirmed_at = db.Column(db.DateTime())
|
|
|
|
#: The roles of the user
|
|
roles = db.relationship('Role',
|
|
secondary=users_roles,
|
|
backref=db.backref('users', lazy='dynamic'))
|
|
|
|
def __repr__(self):
|
|
return f'<User {self.id}({self.username})>'
|
|
|
|
|
|
class Role(db.Model, RoleMixin):
|
|
__tablename__ = 'roles'
|
|
id = db.Column(db.Integer(), primary_key=True)
|
|
|
|
#: The name of the role
|
|
name = db.Column(db.Unicode(length=80), unique=True)
|
|
|
|
#: A description of the role
|
|
description = db.Column(db.UnicodeText)
|
|
|
|
def __repr__(self):
|
|
return f'<Role {self.id}({self.name})>'
|
|
|
|
|
|
class Event(db.Model):
|
|
__tablename__ = 'events'
|
|
id = db.Column(db.Integer(), primary_key=True)
|
|
|
|
#: The ID of the user who created the event
|
|
user_id = db.Column(db.Integer(), db.ForeignKey('users.id'), nullable=False)
|
|
|
|
user = db.relationship('User', backref=db.backref('events', lazy='dynamic'))
|
|
|
|
#: The title of the event
|
|
title = db.Column(db.Unicode(length=200), nullable=False)
|
|
|
|
#: The time zone to be used for `start_time` and `end_time`
|
|
time_zone = db.Column(db.String(length=80), nullable=False)
|
|
|
|
#: The starting timestamp of the event
|
|
start_time = db.Column(db.DateTime(), nullable=False)
|
|
|
|
#: The ending timestamp of the event
|
|
end_time = db.Column(db.DateTime(), nullable=False)
|
|
|
|
#: If `True`, the event is a whole-day event
|
|
all_day = db.Column(db.Boolean(), default=False)
|
|
|
|
#: The description of the event
|
|
description = db.Column(db.UnicodeText())
|
|
|
|
def __as_tz(self, timestamp):
|
|
from pytz import timezone, utc
|
|
|
|
return utc.localize(timestamp).astimezone(timezone(self.time_zone))
|
|
|
|
@property
|
|
def start_time_tz(self):
|
|
return self.__as_tz(self.start_time)
|
|
|
|
@property
|
|
def end_time_tz(self):
|
|
return self.__as_tz(self.end_time)
|
|
|
|
def __repr__(self):
|
|
return f'<Event {self.id} ({self.title}) of {self.user}>'
|