forked from fossasia/open-event-server
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathorder.py
More file actions
135 lines (113 loc) · 4.28 KB
/
order.py
File metadata and controls
135 lines (113 loc) · 4.28 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
import time
from sqlalchemy.sql import func
from app.api.helpers.db import get_new_identifier
from app.models import db
from app.models.base import SoftDeletionModel
from app.models.ticket_holder import TicketHolder
def get_new_id():
return get_new_identifier(Order)
def get_updatable_fields():
"""
:return: The list of fields which can be modified by the order user using the pre payment form.
"""
return [
'country',
'address',
'city',
'state',
'zipcode',
'company',
'tax_business_info',
'status',
'paid_via',
'order_notes',
'deleted_at',
'payment_mode',
'tickets_pdf_url',
'is_billing_enabled',
]
class OrderTicket(SoftDeletionModel):
__tablename__ = 'orders_tickets'
order_id = db.Column(
db.Integer, db.ForeignKey('orders.id', ondelete='CASCADE'), primary_key=True
)
ticket_id = db.Column(
db.Integer, db.ForeignKey('tickets.id', ondelete='CASCADE'), primary_key=True
)
quantity = db.Column(db.Integer)
class Order(SoftDeletionModel):
__tablename__ = "orders"
id = db.Column(db.Integer, primary_key=True)
identifier = db.Column(db.String, unique=True, default=get_new_id)
amount = db.Column(db.Float, nullable=False, default=0)
address = db.Column(db.String)
city = db.Column(db.String)
state = db.Column(db.String)
country = db.Column(db.String)
zipcode = db.Column(db.String)
company = db.Column(db.String)
tax_business_info = db.Column(db.String)
user_id = db.Column(db.Integer, db.ForeignKey('users.id', ondelete='SET NULL'))
event_id = db.Column(db.Integer, db.ForeignKey('events.id', ondelete='SET NULL'))
marketer_id = db.Column(db.Integer, db.ForeignKey('users.id', ondelete='SET NULL'))
created_at = db.Column(db.DateTime(timezone=True), default=func.now())
completed_at = db.Column(db.DateTime(timezone=True), nullable=True, default=None)
trashed_at = db.Column(db.DateTime(timezone=True), nullable=True, default=None)
transaction_id = db.Column(db.String)
paid_via = db.Column(db.String)
payment_mode = db.Column(db.String)
is_billing_enabled = db.Column(db.Boolean, nullable=False, default=False)
brand = db.Column(db.String)
exp_month = db.Column(db.Integer)
exp_year = db.Column(db.Integer)
last4 = db.Column(db.String)
stripe_token = db.Column(db.String)
paypal_token = db.Column(db.String)
status = db.Column(db.String, default='initializing')
cancel_note = db.Column(db.String, nullable=True)
order_notes = db.Column(db.String)
tickets_pdf_url = db.Column(db.String)
discount_code_id = db.Column(
db.Integer,
db.ForeignKey('discount_codes.id', ondelete='SET NULL'),
nullable=True,
default=None,
)
discount_code = db.relationship('DiscountCode', backref='orders')
event = db.relationship('Event', backref='orders')
user = db.relationship('User', backref='orders', foreign_keys=[user_id])
marketer = db.relationship(
'User', backref='marketed_orders', foreign_keys=[marketer_id]
)
tickets = db.relationship("Ticket", secondary='orders_tickets', backref='order')
order_tickets = db.relationship("OrderTicket", backref='order')
def __repr__(self):
return '<Order %r>' % self.id
def get_invoice_number(self):
return (
'O' + str(int(time.mktime(self.created_at.timetuple()))) + '-' + str(self.id)
)
@property
def invoice_number(self):
return self.get_invoice_number()
@property
def tickets_count(self):
return sum(t.quantity for t in self.order_tickets)
@property
def is_free(self):
return self.payment_mode == 'free'
def get_revenue(self):
if self.amount:
return self.amount - min(
self.amount * (self.event.fee / 100.0), self.event.maximum_fee
)
return 0.0
# Saves the order and generates and sends appropriate
# documents and notifications
def populate_and_save(self):
from app.api.orders import save_order
save_order(self)
def is_attendee(self, user):
return db.session.query(
TicketHolder.query.filter_by(order_id=self.id, user=user).exists()
).scalar()