aboutsummaryrefslogtreecommitdiffstats
path: root/models.py
blob: acff9a97269d59a34bab0dde86d893720914362c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
from flask_sqlalchemy import SQLAlchemy
from flask_login import UserMixin
from datetime import datetime
import uuid

db = SQLAlchemy()

def generate_uuid():
    return str(uuid.uuid4())

class User(UserMixin, db.Model):
    __tablename__ = 'users'

    id = db.Column(db.String(36), primary_key=True, default=generate_uuid)
    oauth_id = db.Column(db.String(255), unique=True, nullable=True)
    username = db.Column(db.String(100), nullable=False)
    first_name = db.Column(db.String(100), nullable=True)
    last_name = db.Column(db.String(100), nullable=True)
    email = db.Column(db.String(255), nullable=True)
    profile_picture = db.Column(db.LargeBinary, nullable=True)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)

    polls = db.relationship('Poll', backref='creator', lazy='dynamic')
    responses = db.relationship('PollResponse', backref='user', lazy='dynamic')

class Poll(db.Model):
    __tablename__ = 'polls'

    id = db.Column(db.String(36), primary_key=True, default=generate_uuid)
    title = db.Column(db.String(200), nullable=False)
    description = db.Column(db.Text, nullable=True)
    creator_id = db.Column(db.String(36), db.ForeignKey('users.id'), nullable=False)
    allow_anonymous = db.Column(db.Boolean, default=False, nullable=False)
    allowed_dates = db.Column(db.Text, nullable=True)  # JSON array of date strings
    is_locked = db.Column(db.Boolean, default=False, nullable=False)
    is_day_wise = db.Column(db.Boolean, default=False, nullable=False)
    chosen_slots = db.Column(db.Text, nullable=True)  # JSON array of {date, start} objects
    created_at = db.Column(db.DateTime, default=datetime.utcnow)

    responses = db.relationship('PollResponse', backref='poll', lazy='dynamic', cascade='all, delete-orphan')
    participants = db.relationship('PollParticipant', backref='poll', lazy='dynamic', cascade='all, delete-orphan')

class PollParticipant(db.Model):
    __tablename__ = 'poll_participants'

    id = db.Column(db.String(36), primary_key=True, default=generate_uuid)
    poll_id = db.Column(db.String(36), db.ForeignKey('polls.id'), nullable=False)
    user_id = db.Column(db.String(36), db.ForeignKey('users.id'), nullable=True)
    guest_name = db.Column(db.String(100), nullable=True)
    session_key = db.Column(db.String(64), nullable=True)
    joined_at = db.Column(db.DateTime, default=datetime.utcnow)

    user = db.relationship('User', backref='participations')

    @property
    def display_name(self):
        if self.user:
            if self.user.first_name and self.user.last_name:
                return f"{self.user.first_name} {self.user.last_name}"
            return self.user.username
        return self.guest_name

class PollResponse(db.Model):
    __tablename__ = 'poll_responses'

    id = db.Column(db.String(36), primary_key=True, default=generate_uuid)
    poll_id = db.Column(db.String(36), db.ForeignKey('polls.id'), nullable=False)
    user_id = db.Column(db.String(36), db.ForeignKey('users.id'), nullable=True)

    # For non-oauth users
    guest_name = db.Column(db.String(100), nullable=True)
    guest_email = db.Column(db.String(255), nullable=True)
    guest_profile_picture = db.Column(db.LargeBinary, nullable=True)

    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)

    time_slots = db.relationship('TimeSlot', backref='response', lazy='dynamic', cascade='all, delete-orphan')

    @property
    def display_name(self):
        if self.user:
            if self.user.first_name and self.user.last_name:
                return f"{self.user.first_name} {self.user.last_name}"
            return self.user.username
        return self.guest_name

    @property
    def display_email(self):
        if self.user:
            return self.user.email
        return self.guest_email

class TimeSlot(db.Model):
    __tablename__ = 'time_slots'

    id = db.Column(db.String(36), primary_key=True, default=generate_uuid)
    response_id = db.Column(db.String(36), db.ForeignKey('poll_responses.id'), nullable=False)
    date = db.Column(db.Date, nullable=False)
    start_minutes = db.Column(db.Integer, nullable=False)  # minutes from midnight (0-1439)
    end_minutes = db.Column(db.Integer, nullable=False)    # minutes from midnight (0-1440)
    note = db.Column(db.String(500), nullable=True)