File size: 4,922 Bytes
d20dd7e
 
 
 
b77857f
d20dd7e
 
 
 
 
 
 
 
 
 
 
 
 
 
ef362ff
d20dd7e
 
 
 
 
 
 
 
 
 
 
 
 
ef362ff
d20dd7e
 
 
 
 
 
 
 
 
 
 
ef362ff
d20dd7e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
702c8e5
d20dd7e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
104
105
106
107
108
109
110
111
112
113
114
import locale
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy_serializer import SerializerMixin

locale.setlocale(locale.LC_TIME, 'it_IT.UTF-8')

db = SQLAlchemy()

class User(db.Model, SerializerMixin):
    __tablename__ = 'users'
    id = db.mapped_column(db.Integer(), primary_key=True)
    cognome = db.mapped_column(db.String(50), nullable=False)
    nome = db.mapped_column(db.String(50), nullable=False)
    telefono = db.mapped_column(db.String(20), nullable=False)
    email = db.mapped_column(db.String(50), unique=True, nullable=False)
    password = db.mapped_column(db.String(30), nullable=False)
    # -- RELATIONSHIPS --
    prenotazioni = db.relationship('Prenotazione', back_populates='user', lazy='dynamic')

    serialize_rules = ('-prenotazioni.user', '-password')


class Produttore(db.Model, SerializerMixin):
    __tablename__ = 'produttori'
    id = db.mapped_column(db.Integer(), primary_key=True)
    nome = db.mapped_column(db.String(100), nullable=False)
    descrizione = db.mapped_column(db.Text(), nullable=False)
    indirizzo = db.mapped_column(db.Text(), nullable=False)
    telefono = db.mapped_column(db.String(20), nullable=False)
    email = db.mapped_column(db.String(50), nullable=False)
    # -- RELATIONSHIPS --
    prodotti = db.relationship('Prodotto', back_populates='produttore')

    serialize_rules = ('-prodotti.produttore', '-prodotti.lotti.prenotazioni')


class Prodotto(db.Model, SerializerMixin):
    __tablename__ = 'prodotti'
    id = db.mapped_column(db.Integer(), primary_key=True)
    produttore_id = db.mapped_column(db.Integer(), db.ForeignKey('produttori.id'), nullable=False)
    nome = db.mapped_column(db.String(50), nullable=False)
    # -- RELATIONSHIPS --
    produttore = db.relationship('Produttore', back_populates='prodotti')
    lotti = db.relationship('Lotto', back_populates='prodotto')
    
    serialize_rules = ('-produttore.prodotti', '-lotti.prodotto', '-lotti.prenotazioni')


class Lotto(db.Model, SerializerMixin):
    __tablename__ = 'lotti'
    id = db.mapped_column(db.Integer(), primary_key=True)
    prodotto_id = db.mapped_column(db.Integer(), db.ForeignKey('prodotti.id'), nullable=False)
    data_consegna = db.mapped_column(db.Date(), nullable=False)
    qta_unita_misura = db.mapped_column(db.String(10), nullable=False)
    qta_lotto = db.mapped_column(db.Integer(), nullable=False)
    prezzo_unitario = db.mapped_column(db.Float(), nullable=False)
    sospeso = db.mapped_column(db.Boolean(), default=False)
    # -- RELATIONSHIPS --
    prodotto = db.relationship('Prodotto', back_populates='lotti')
    prenotazioni = db.relationship('Prenotazione', back_populates='lotto')

    serialize_rules = ('-prodotto.lotti', '-prenotazioni.lotto', 'get_qta_disponibile', 'get_date', 'get_prezzo_str')

    def get_qta_disponibile(self):
        qta_prenotata = sum(prenotazione.qta for prenotazione in self.prenotazioni)
        return self.qta_lotto - qta_prenotata
    
    def get_date(self):
        return self.data_consegna.strftime('%A %d/%m/%Y')
    
    def get_prezzo_str(self):
        return f'{self.prezzo_unitario:.2f} €/{self.qta_unita_misura}'

class Prenotazione(db.Model, SerializerMixin):
    __tablename__ = 'prenotazioni'
    id = db.mapped_column(db.Integer(), primary_key=True)
    user_id = db.mapped_column(db.Integer(), db.ForeignKey('users.id'), nullable=False)
    lotto_id = db.mapped_column(db.Integer(), db.ForeignKey('lotti.id'), nullable=False)
    qta = db.mapped_column(db.Integer, nullable=False)
    # -- RELATIONSHIPS --
    user = db.relationship('User', back_populates='prenotazioni')
    lotto = db.relationship('Lotto', back_populates='prenotazioni')  # , order_by='Lotto.data_consegna')

    serialize_rules = ('-user.prenotazioni', '-lotto.prenotazioni', 'get_prezzo_totale_str')


    __table_args__ = (
        db.UniqueConstraint('user_id', 'lotto_id', name='user_id_lotto_id_uniq'),
    )

    @db.validates('qta')
    def validate_qta(self, key, qta):
        if qta <= 0:
            raise ValueError('La quantità deve essere maggiore di zero.')
        
        # Per usare questo, va rivisto lo script di inizializzazione del DB
        # altre_prenotazioni = Prenotazione.query.filter(
        #     Prenotazione.lotto_id == self.lotto_id,
        #     Prenotazione.id != self.id
        # ).all()
        # qta_gia_prenotata = sum(prenotazione.qta for prenotazione in altre_prenotazioni)
        # lotto = db.session.query(Lotto).get(self.lotto_id)
        # if qta_gia_prenotata + qta > lotto.qta_lotto:
        #     raise ValueError('Quantità non disponibile!')

        # lotto = db.session.query(Lotto).get(self.lotto_id)
        # if lotto.sospeso:
        #     raise ValueError('Il lotto è sospeso!')
        
        return qta

    def get_prezzo_totale_str(self):
        prezzo = self.qta * self.lotto.prezzo_unitario
        return f'€ {prezzo:.2f}'