forked from learn-co-curriculum/python-p3-freebie-tracker
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmodels.py
More file actions
144 lines (96 loc) · 4.24 KB
/
models.py
File metadata and controls
144 lines (96 loc) · 4.24 KB
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
from sqlalchemy import ForeignKey, Column, Integer, String, MetaData, ForeignKeyConstraint,Table
from sqlalchemy.orm import relationship, backref
from sqlalchemy.orm import declarative_base
from sqlalchemy import create_engine
convention = {
"fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s",
}
metadata = MetaData(naming_convention=convention)
engine = create_engine('sqlite:///freebies.db')
Base = declarative_base(metadata=metadata)
# #Association table
companies_devs = Table(
'companies_devs', Base.metadata,
Column('company_id', Integer, ForeignKey('companies.id'), primary_key=True),
Column('dev_id', Integer, ForeignKey('devs.id'), primary_key=True)
)
class Company(Base):
__tablename__ = 'companies'
#one-to-many relationship
freebie=relationship('Freebie',backref='company')
# Many-to-many relationship with Dev
devs = relationship("Dev", secondary=companies_devs, back_populates="companies")
id = Column(Integer(), primary_key=True)
name = Column(String())
founding_year = Column(Integer())
def __init__(self, name, founding_year):
self.name = name
self.founding_year = founding_year
self.freebies = [] # To store all freebies associated with this company
# Method to give a freebie to a developer
def give_freebie(self, dev, item_name, value):
freebie = Freebie(item_name=item_name, value=value, dev=dev, company=self)
self.freebies.append(freebie)
return freebie
# Method to return all freebies given by this company
def get_freebies(self):
return self.freebies
# Method to return all developers who have collected freebies from this company
def devs(self):
return set(freebie.dev for freebie in self.freebies)
# Class method to get the oldest company
@classmethod
def oldest_company(cls, companies):
#Find and return the company with the earliest founding year
return min(companies, key=lambda company: company.founding_year)
def __repr__(self):
return f'<Company {self.name}>'
class Dev(Base):
__tablename__ = 'devs'
#one-to-many relationship
freebies=relationship('Freebie',backref='dev')
# Many-to-many relationship with Company
companies = relationship("Company", secondary=companies_devs, back_populates="devs")
id = Column(Integer(), primary_key=True)
name= Column(String())
def __init__(self, name):
self.name = name
self.freebies=[]
# Method to check if the dev has received a specific freebie item
def received_one(self, item_name):
# Check if any freebie associated with this dev has the given item_name
return any(freebie.item_name == item_name for freebie in self.freebies)
def give_away(self,dev,freebie):
if freebie.dev == self:
# If the freebie belongs to the current developer, change its ownership
freebie.dev = dev
dev.freebies.append(freebie) # Add the freebie to the new dev's list
# remove the freebie from the current dev's list
if freebie in self.freebies:
self.freebies.remove(freebie)
return True
return False
# Method to return all the companies that gave freebies to this developer
def companies(self):
return set(freebie.company for freebie in self.freebies)
def __repr__(self):
return f'<Dev {self.name}>'
class Freebie(Base):
__tablename__='freebies'
id=Column(Integer(),primary_key=True)
item_name=Column(String(255))
value=Column(Integer)
#foriegnkey to dev and company
dev_id=Column(Integer,ForeignKey('devs.id'))
company_id=Column(Integer,ForeignKey('companies.id'))
def __init__(self, item_name, value, dev, company):
self.item_name = item_name
self.value = value
self.dev = dev
self.company = company
def print_details(self):
# Format and return the string as specified
return f"{self.dev.name} owns a {self.item_name} from {self.company.name}."
def __repr__(self):
return f"<Freebie(item_name={self.item_name}, value={self.value})>"
Base.metadata.create_all(engine)