Skip to content

Commit a60e630

Browse files
Merge pull request #6811 from fossasia/development
chore: Release v1.12.0
2 parents 4310760 + 2afce3b commit a60e630

File tree

353 files changed

+12027
-6762
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

353 files changed

+12027
-6762
lines changed

.flake8.ini renamed to .flake8

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
[flake8]
2-
max-line-length = 120
2+
max-line-length = 90
33
exclude =
44
.git,
55
__pycache__,

.hound.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
python:
22
enabled: true
3-
config_file: .flake8.ini
3+
config_file: .flake8

.pre-commit-config.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
repos:
2+
- repo: https://github.com/psf/black
3+
rev: stable
4+
hooks:
5+
- id: black
6+
language_version: python3.7

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
## Changelog
22

3+
#### v1.12.0 (2020-02-02):
4+
5+
- Add check if donation ticket has payment method enabled
6+
- Fix general event statistics type
7+
- Internal refactoring and code cleanup
8+
39
#### v1.11.2 (2020-01-25):
410

511
- Fix celery task status endpoint

app/__init__.py

Whitespace-only changes.

app/api/access_codes.py

Lines changed: 75 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,28 @@
44

55
from app.api.bootstrap import api
66
from app.api.helpers.db import safe_query
7-
from app.api.helpers.exceptions import ForbiddenException, ConflictException
8-
from app.api.helpers.exceptions import UnprocessableEntity
7+
from app.api.helpers.exceptions import (
8+
ConflictException,
9+
ForbiddenException,
10+
UnprocessableEntity,
11+
)
912
from app.api.helpers.permission_manager import has_access
1013
from app.api.helpers.permissions import jwt_required
1114
from app.api.helpers.query import event_query
1215
from app.api.helpers.utilities import require_relationship
1316
from app.api.schema.access_codes import AccessCodeSchema
1417
from app.models import db
1518
from app.models.access_code import AccessCode
19+
from app.models.event import Event
1620
from app.models.ticket import Ticket
1721
from app.models.user import User
18-
from app.models.event import Event
1922

2023

2124
class AccessCodeListPost(ResourceList):
2225
"""
2326
Create AccessCodes
2427
"""
28+
2529
def before_post(self, args, kwargs, data):
2630
"""
2731
before post method to check for required relationships and permissions
@@ -45,28 +49,39 @@ def before_create_object(self, data, view_kwargs):
4549
for ticket in data['tickets']:
4650
# Ensuring that the ticket exists and is hidden.
4751
try:
48-
ticket_object = self.session.query(Ticket).filter_by(id=int(ticket),
49-
deleted_at=None).one()
52+
ticket_object = (
53+
self.session.query(Ticket)
54+
.filter_by(id=int(ticket), deleted_at=None)
55+
.one()
56+
)
5057
if not ticket_object.is_hidden:
51-
raise ConflictException({'pointer': '/data/relationships/tickets'},
52-
"Ticket with id {} is public.".format(ticket) +
53-
" Access code cannot be applied to public tickets")
58+
raise ConflictException(
59+
{'pointer': '/data/relationships/tickets'},
60+
"Ticket with id {} is public.".format(ticket)
61+
+ " Access code cannot be applied to public tickets",
62+
)
5463
except NoResultFound:
55-
raise ConflictException({'pointer': '/data/relationships/tickets'},
56-
"Ticket with id {} does not exists".format(str(ticket)))
64+
raise ConflictException(
65+
{'pointer': '/data/relationships/tickets'},
66+
"Ticket with id {} does not exists".format(str(ticket)),
67+
)
5768

5869
schema = AccessCodeSchema
59-
methods = ['POST', ]
60-
data_layer = {'session': db.session,
61-
'model': AccessCode,
62-
'methods': {'before_create_object': before_create_object
63-
}}
70+
methods = [
71+
'POST',
72+
]
73+
data_layer = {
74+
'session': db.session,
75+
'model': AccessCode,
76+
'methods': {'before_create_object': before_create_object},
77+
}
6478

6579

6680
class AccessCodeList(ResourceList):
6781
"""
6882
List AccessCodes
6983
"""
84+
7085
def query(self, view_kwargs):
7186
"""
7287
Method to get access codes list based on different view_kwargs
@@ -90,19 +105,22 @@ def query(self, view_kwargs):
90105
return query_
91106

92107
view_kwargs = True
93-
methods = ['GET', ]
108+
methods = [
109+
'GET',
110+
]
94111
schema = AccessCodeSchema
95-
data_layer = {'session': db.session,
96-
'model': AccessCode,
97-
'methods': {
98-
'query': query,
99-
}}
112+
data_layer = {
113+
'session': db.session,
114+
'model': AccessCode,
115+
'methods': {'query': query,},
116+
}
100117

101118

102119
class AccessCodeDetail(ResourceDetail):
103120
"""
104121
AccessCode detail by id or code
105122
"""
123+
106124
def before_get(self, args, kwargs):
107125
"""
108126
before get method of access code details.
@@ -115,12 +133,21 @@ def before_get(self, args, kwargs):
115133

116134
if kwargs.get('access_event_identifier'):
117135
event = safe_query(
118-
db, Event, 'identifier', kwargs['access_event_identifier'],
119-
'event_identifier')
136+
db,
137+
Event,
138+
'identifier',
139+
kwargs['access_event_identifier'],
140+
'event_identifier',
141+
)
120142
kwargs['access_event_id'] = event.id
121143
if kwargs.get('code') and kwargs.get('access_event_id'):
122-
access = db.session.query(AccessCode).filter_by(code=kwargs.get('code'),
123-
event_id=kwargs.get('access_event_id')).first()
144+
access = (
145+
db.session.query(AccessCode)
146+
.filter_by(
147+
code=kwargs.get('code'), event_id=kwargs.get('access_event_id')
148+
)
149+
.first()
150+
)
124151
if access:
125152
kwargs['id'] = access.id
126153
else:
@@ -134,35 +161,44 @@ def before_get(self, args, kwargs):
134161
raise ObjectNotFound({'parameter': '{id}'}, "Access Code: not found")
135162

136163
if not has_access('is_coorganizer', event_id=access.event_id):
137-
raise UnprocessableEntity({'source': ''},
138-
"Please verify your permission")
139-
140-
decorators = (api.has_permission('is_coorganizer', fetch='event_id',
141-
fetch_as="event_id", model=AccessCode, methods="PATCH"),
142-
api.has_permission('is_coorganizer_but_not_admin', fetch='event_id',
143-
fetch_as="event_id", model=AccessCode, methods="DELETE"),)
164+
raise UnprocessableEntity({'source': ''}, "Please verify your permission")
165+
166+
decorators = (
167+
api.has_permission(
168+
'is_coorganizer',
169+
fetch='event_id',
170+
fetch_as="event_id",
171+
model=AccessCode,
172+
methods="PATCH",
173+
),
174+
api.has_permission(
175+
'is_coorganizer_but_not_admin',
176+
fetch='event_id',
177+
fetch_as="event_id",
178+
model=AccessCode,
179+
methods="DELETE",
180+
),
181+
)
144182
schema = AccessCodeSchema
145-
data_layer = {'session': db.session,
146-
'model': AccessCode
147-
}
183+
data_layer = {'session': db.session, 'model': AccessCode}
148184

149185

150186
class AccessCodeRelationshipRequired(ResourceRelationship):
151187
"""
152188
AccessCode Relationship Required
153189
"""
190+
154191
decorators = (jwt_required,)
155192
methods = ['GET', 'PATCH']
156193
schema = AccessCodeSchema
157-
data_layer = {'session': db.session,
158-
'model': AccessCode}
194+
data_layer = {'session': db.session, 'model': AccessCode}
159195

160196

161197
class AccessCodeRelationshipOptional(ResourceRelationship):
162198
"""
163199
AccessCode Relationship Optional
164200
"""
201+
165202
decorators = (jwt_required,)
166203
schema = AccessCodeSchema
167-
data_layer = {'session': db.session,
168-
'model': AccessCode}
204+
data_layer = {'session': db.session, 'model': AccessCode}

app/api/activities.py

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,23 @@ class ActivityList(ResourceList):
1010
"""
1111
List and create activity
1212
"""
13+
1314
schema = ActivitySchema
14-
methods = ['GET', ]
15-
decorators = (api.has_permission('is_admin', ),)
16-
data_layer = {'session': db.session,
17-
'model': Activity}
15+
methods = [
16+
'GET',
17+
]
18+
decorators = (api.has_permission('is_admin',),)
19+
data_layer = {'session': db.session, 'model': Activity}
1820

1921

2022
class ActivityDetail(ResourceDetail):
2123
"""
2224
Activity detail by id
2325
"""
26+
2427
schema = ActivitySchema
25-
methods = ['GET', ]
26-
decorators = (api.has_permission('is_admin', ),)
27-
data_layer = {'session': db.session,
28-
'model': Activity}
28+
methods = [
29+
'GET',
30+
]
31+
decorators = (api.has_permission('is_admin',),)
32+
data_layer = {'session': db.session, 'model': Activity}

app/api/admin_sales/discounted.py

Lines changed: 58 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
from sqlalchemy import func
21
from flask_rest_jsonapi import ResourceList
32
from marshmallow_jsonapi import fields
43
from marshmallow_jsonapi.flask import Schema
4+
from sqlalchemy import func
55

6-
from app.api.helpers.utilities import dasherize
76
from app.api.bootstrap import api
7+
from app.api.helpers.utilities import dasherize
88
from app.models import db
99
from app.models.discount_code import DiscountCode
1010
from app.models.event import Event
@@ -13,20 +13,24 @@
1313

1414

1515
def sales_per_marketer_and_discount_by_status(status):
16-
return db.session.query(Event.id.label('event_id'),
17-
DiscountCode.id.label('discount_code_id'),
18-
User.id.label('marketer_id'),
19-
func.sum(Order.amount).label(status + '_sales'),
20-
func.sum(OrderTicket.quantity).label(status + '_tickets')) \
21-
.filter(Event.id == Order.event_id) \
22-
.filter(Order.marketer_id == User.id) \
23-
.filter(Order.discount_code_id == DiscountCode.id) \
24-
.filter(Order.status == status) \
25-
.group_by(Event) \
26-
.group_by(DiscountCode) \
27-
.group_by(User) \
28-
.group_by(Order.status) \
29-
.cte()
16+
return (
17+
db.session.query(
18+
Event.id.label('event_id'),
19+
DiscountCode.id.label('discount_code_id'),
20+
User.id.label('marketer_id'),
21+
func.sum(Order.amount).label(status + '_sales'),
22+
func.sum(OrderTicket.quantity).label(status + '_tickets'),
23+
)
24+
.filter(Event.id == Order.event_id)
25+
.filter(Order.marketer_id == User.id)
26+
.filter(Order.discount_code_id == DiscountCode.id)
27+
.filter(Order.status == status)
28+
.group_by(Event)
29+
.group_by(DiscountCode)
30+
.group_by(User)
31+
.group_by(Order.status)
32+
.cte()
33+
)
3034

3135

3236
class AdminSalesDiscountedSchema(Schema):
@@ -80,38 +84,44 @@ def query(self, _):
8084
completed = sales_per_marketer_and_discount_by_status('completed')
8185
placed = sales_per_marketer_and_discount_by_status('placed')
8286

83-
discounts = self.session.query(Event.id.label('event_id'),
84-
Event.name.label('event_name'),
85-
DiscountCode.id.label('discount_code_id'),
86-
DiscountCode.code.label('code'),
87-
User.id.label('marketer_id'),
88-
User.email.label('email')) \
89-
.filter(Event.id == Order.event_id) \
90-
.filter(Order.marketer_id == User.id) \
91-
.filter(Order.discount_code_id == DiscountCode.id) \
92-
.cte()
93-
94-
return self.session.query(discounts, pending, completed, placed) \
95-
.outerjoin(pending,
96-
(pending.c.event_id == discounts.c.event_id) &
97-
(pending.c.discount_code_id == discounts.c.discount_code_id) &
98-
(pending.c.marketer_id == discounts.c.marketer_id)) \
99-
.outerjoin(completed,
100-
(completed.c.event_id == discounts.c.event_id) &
101-
(completed.c.discount_code_id == discounts.c.discount_code_id) &
102-
(completed.c.marketer_id == discounts.c.marketer_id)) \
103-
.outerjoin(placed,
104-
(placed.c.event_id == discounts.c.event_id) &
105-
(placed.c.discount_code_id == discounts.c.discount_code_id) &
106-
(placed.c.marketer_id == discounts.c.marketer_id))
87+
discounts = (
88+
self.session.query(
89+
Event.id.label('event_id'),
90+
Event.name.label('event_name'),
91+
DiscountCode.id.label('discount_code_id'),
92+
DiscountCode.code.label('code'),
93+
User.id.label('marketer_id'),
94+
User.email.label('email'),
95+
)
96+
.filter(Event.id == Order.event_id)
97+
.filter(Order.marketer_id == User.id)
98+
.filter(Order.discount_code_id == DiscountCode.id)
99+
.cte()
100+
)
101+
102+
return (
103+
self.session.query(discounts, pending, completed, placed)
104+
.outerjoin(
105+
pending,
106+
(pending.c.event_id == discounts.c.event_id)
107+
& (pending.c.discount_code_id == discounts.c.discount_code_id)
108+
& (pending.c.marketer_id == discounts.c.marketer_id),
109+
)
110+
.outerjoin(
111+
completed,
112+
(completed.c.event_id == discounts.c.event_id)
113+
& (completed.c.discount_code_id == discounts.c.discount_code_id)
114+
& (completed.c.marketer_id == discounts.c.marketer_id),
115+
)
116+
.outerjoin(
117+
placed,
118+
(placed.c.event_id == discounts.c.event_id)
119+
& (placed.c.discount_code_id == discounts.c.discount_code_id)
120+
& (placed.c.marketer_id == discounts.c.marketer_id),
121+
)
122+
)
107123

108124
methods = ['GET']
109-
decorators = (api.has_permission('is_admin'), )
125+
decorators = (api.has_permission('is_admin'),)
110126
schema = AdminSalesDiscountedSchema
111-
data_layer = {
112-
'model': Event,
113-
'session': db.session,
114-
'methods': {
115-
'query': query
116-
}
117-
}
127+
data_layer = {'model': Event, 'session': db.session, 'methods': {'query': query}}

0 commit comments

Comments
 (0)