Skip to content

Commit 3086a8e

Browse files
authored
Merge pull request #8928 from fossasia/development
Merge dev into master
2 parents 1826ba3 + 84b9c40 commit 3086a8e

Some content is hidden

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

67 files changed

+1841
-1536
lines changed

.pre-commit-config.yaml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
exclude: '.venv|migrations'
2+
default_language_version:
3+
python: python3.8
24
repos:
35
- repo: https://github.com/asottile/pyupgrade
46
rev: v2.12.0
@@ -11,11 +13,11 @@ repos:
1113
- id: pycln
1214
args: [--config=pyproject.toml]
1315
- repo: https://github.com/pycqa/isort
14-
rev: 5.8.0
16+
rev: 5.12.0
1517
hooks:
1618
- id: isort
1719
- repo: https://github.com/psf/black
18-
rev: 20.8b1
20+
rev: 22.3.0
1921
hooks:
2022
- id: black
2123
language_version: python3.8

README.md

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,52 @@ Read more [here](/docs/general/roles.md).
152152

153153
## Development
154154

155+
### Initial setup
156+
157+
#### Python and Poetry installatioon
158+
159+
We use Python 3.8. If your operating system does not provide Python 3.8 out of the
160+
box, it is best installed using [`pyenv`](https://github.com/pyenv/pyenv/).
161+
162+
For Mac users, see [here](https://opensource.com/article/19/5/python-3-default-mac) for more info.
163+
```bash
164+
$ brew install pyenv
165+
$ pyenv init # follow instructions to add run commands to your environment
166+
```
167+
After editing your environment file, reload your shell and navigate to this repo, then install `3.8.17` to be used locally:
168+
```bash
169+
$ pyenv install 3.8.17
170+
$ cd ...your../open-event-server/
171+
$ pyenv local 3.8.17
172+
```
173+
Now the Python version should automatically change when used within open-event-server.
174+
175+
176+
We also expect [poetry](https://python-poetry.org/) being available.
177+
178+
#### Package setup
179+
180+
Change into the `open-event-server` directory, and execute the following commands:
181+
182+
Activate Python 3.8.17 locally
183+
```bash
184+
$ pyenv local 3.8.17
185+
```
186+
187+
Install dependencies using poetry
188+
```bash
189+
$ poetry install --with dev
190+
```
191+
192+
Activate the pre-commit hook
193+
```bash
194+
$ poetry run pre-commit install
195+
```
196+
197+
With that every git commit will be checked/formatted with various tools before
198+
being actually committed.
199+
200+
155201
### Development Mode
156202

157203
To enable development mode (development Flask config), set `APP_CONFIG` environment variable to "config.DevelopmentConfig".

app/api/access_codes.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ def before_create_object(self, data, view_kwargs):
5959
except NoResultFound:
6060
raise ConflictError(
6161
{'pointer': '/data/relationships/tickets'},
62-
"Ticket with id {} does not exists".format(str(ticket)),
62+
f"Ticket with id {str(ticket)} does not exists",
6363
)
6464

6565
schema = AccessCodeSchema

app/api/attendees.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -225,9 +225,7 @@ def before_update_object(self, obj, data, kwargs):
225225
'Only admin or that user itself can update attendee info',
226226
)
227227

228-
if order.status != 'initializing' and (
229-
'checkin_times' not in data
230-
):
228+
if order.status != 'initializing' and ('checkin_times' not in data):
231229
raise UnprocessableEntityError(
232230
{'pointer': '/data/id'},
233231
"Attendee can't be updated because the corresponding order is not in initializing state",

app/api/chat/rocket_chat.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import random
33
import string
44
from dataclasses import dataclass
5+
from typing import Optional
56

67
import requests
78

@@ -10,7 +11,6 @@
1011
from app.models.event import Event
1112
from app.models.user import User
1213
from app.settings import get_settings
13-
from typing import Optional
1414

1515
logger = logging.getLogger(__name__)
1616

app/api/custom/invoices.py

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,7 @@ def event_invoices(invoice_identifier):
3434
raise ForbiddenError({'source': ''}, 'Unauthorized Access')
3535
key = UPLOAD_PATHS['pdf']['event_invoices'].format(identifier=invoice_identifier)
3636
file_path = (
37-
'../generated/invoices/{}/{}/'.format(key, generate_hash(key))
38-
+ invoice_identifier
39-
+ '.pdf'
37+
f'../generated/invoices/{key}/{generate_hash(key)}/{invoice_identifier}.pdf'
4038
)
4139
try:
4240
return return_file('event-invoice', file_path, invoice_identifier)
@@ -56,14 +54,11 @@ def order_invoices(order_identifier):
5654
order = Order.query.filter_by(identifier=order_identifier).first()
5755
except NoResultFound:
5856
raise NotFoundError({'source': ''}, 'Order Invoice not found')
59-
if (
60-
has_access(
61-
'is_coorganizer_or_user_itself',
62-
event_id=order.event_id,
63-
user_id=order.user_id,
64-
)
65-
or order.is_attendee(current_user)
66-
):
57+
if has_access(
58+
'is_coorganizer_or_user_itself',
59+
event_id=order.event_id,
60+
user_id=order.user_id,
61+
) or order.is_attendee(current_user):
6762
file_path = order.invoice_pdf_path
6863
if not os.path.isfile(file_path):
6964
create_pdf_tickets_for_holder(order)

app/api/custom/orders.py

Lines changed: 41 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
import os
2-
32
from datetime import datetime
43

5-
64
from flask import Blueprint, jsonify, make_response, request
75
from flask.helpers import send_from_directory
86
from flask_jwt_extended import current_user, jwt_required
@@ -12,18 +10,20 @@
1210
from app.api.helpers.db import safe_query, save_to_db
1311
from app.api.helpers.errors import ForbiddenError, NotFoundError, UnprocessableEntityError
1412
from app.api.helpers.mail import send_email_to_attendees
15-
from app.api.helpers.order import calculate_order_amount, create_pdf_tickets_for_holder, on_order_completed
13+
from app.api.helpers.order import (
14+
calculate_order_amount,
15+
create_pdf_tickets_for_holder,
16+
on_order_completed,
17+
)
18+
from app.api.helpers.payment import StripePaymentsManager
1619
from app.api.helpers.permission_manager import has_access
1720
from app.api.orders import validate_attendees
1821
from app.api.schema.orders import OrderSchema
1922
from app.extensions.limiter import limiter
2023
from app.models import db
21-
from app.models.order import Order
22-
from app.models.order import OrderTicket
24+
from app.models.order import Order, OrderTicket
2325
from app.models.ticket import Ticket
2426
from app.models.ticket_holder import TicketHolder
25-
from app.api.helpers.payment import StripePaymentsManager
26-
2727

2828
order_blueprint = Blueprint('order_blueprint', __name__, url_prefix='/v1/orders')
2929
ticket_blueprint = Blueprint('ticket_blueprint', __name__, url_prefix='/v1/tickets')
@@ -40,14 +40,11 @@ def ticket_attendee_authorized(order_identifier):
4040
raise NotFoundError(
4141
{'source': ''}, 'This ticket is not associated with any order'
4242
)
43-
if (
44-
has_access(
45-
'is_coorganizer_or_user_itself',
46-
event_id=order.event_id,
47-
user_id=order.user_id,
48-
)
49-
or order.is_attendee(current_user)
50-
):
43+
if has_access(
44+
'is_coorganizer_or_user_itself',
45+
event_id=order.event_id,
46+
user_id=order.user_id,
47+
) or order.is_attendee(current_user):
5148
file_path = order.ticket_pdf_path
5249
if not os.path.isfile(file_path):
5350
create_pdf_tickets_for_holder(order)
@@ -155,7 +152,7 @@ def create_order():
155152
ticket_info = ticket_map[order_ticket.ticket.id]
156153
order_ticket.price = ticket_info.get('price')
157154
save_to_db(order_ticket)
158-
155+
159156
return OrderSchema().dump(order)
160157

161158

@@ -184,30 +181,47 @@ def ticket_attendee_pdf(attendee_id):
184181
create_pdf_tickets_for_holder(ticket_holder.order)
185182
return send_from_directory('../', file_path, as_attachment=True)
186183

184+
187185
@order_blueprint.route('/<string:order_identifier>/verify', methods=['POST'])
188186
def verify_order_payment(order_identifier):
189187

190188
order = Order.query.filter_by(identifier=order_identifier).first()
191-
189+
192190
if order.payment_mode == 'stripe':
193191
try:
194-
payment_intent = StripePaymentsManager.retrieve_payment_intent(order.event, order.stripe_payment_intent_id)
192+
payment_intent = StripePaymentsManager.retrieve_payment_intent(
193+
order.event, order.stripe_payment_intent_id
194+
)
195195
except Exception as e:
196196
raise e
197197

198198
if payment_intent['status'] == 'succeeded':
199199
order.status = 'completed'
200200
order.completed_at = datetime.utcnow()
201-
order.paid_via = payment_intent['charges']['data'][0]['payment_method_details']['type']
202-
order.transaction_id = payment_intent['charges']['data'][0]['balance_transaction']
203-
if payment_intent['charges']['data'][0]['payment_method_details']['type'] == 'card' :
204-
order.brand = payment_intent['charges']['data'][0]['payment_method_details']['card']['brand']
205-
order.exp_month = payment_intent['charges']['data'][0]['payment_method_details']['card']['exp_month']
206-
order.exp_year = payment_intent['charges']['data'][0]['payment_method_details']['card']['exp_year']
207-
order.last4 = payment_intent['charges']['data'][0]['payment_method_details']['card']['last4']
201+
order.paid_via = payment_intent['charges']['data'][0][
202+
'payment_method_details'
203+
]['type']
204+
order.transaction_id = payment_intent['charges']['data'][0][
205+
'balance_transaction'
206+
]
207+
if (
208+
payment_intent['charges']['data'][0]['payment_method_details']['type']
209+
== 'card'
210+
):
211+
order.brand = payment_intent['charges']['data'][0][
212+
'payment_method_details'
213+
]['card']['brand']
214+
order.exp_month = payment_intent['charges']['data'][0][
215+
'payment_method_details'
216+
]['card']['exp_month']
217+
order.exp_year = payment_intent['charges']['data'][0][
218+
'payment_method_details'
219+
]['card']['exp_year']
220+
order.last4 = payment_intent['charges']['data'][0][
221+
'payment_method_details'
222+
]['card']['last4']
208223
save_to_db(order)
209224

210225
on_order_completed(order)
211226

212-
213-
return jsonify({ 'payment_status': order.status})
227+
return jsonify({'payment_status': order.status})

app/api/event_invoices.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,7 @@ def before_get_object(self, view_kwargs):
7676
if not current_user.is_staff and event_invoice.user_id != current_user.id:
7777
raise ForbiddenError({'source': ''}, 'Admin access is required')
7878

79-
methods = [
80-
'GET','PATCH'
81-
]
79+
methods = ['GET', 'PATCH']
8280
decorators = (jwt_required,)
8381
schema = EventInvoiceSchema
8482
data_layer = {

app/api/groups.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
1-
from app.models.role import Role
2-
from app.models.user import User
31
from flask import request
42
from flask_jwt_extended import current_user
53
from flask_rest_jsonapi import ResourceDetail, ResourceList, ResourceRelationship
6-
from flask_rest_jsonapi.exceptions import ObjectNotFound
74

85
from app.api.bootstrap import api
96
from app.api.helpers.db import safe_query_kwargs
@@ -16,6 +13,8 @@
1613
from app.models import db
1714
from app.models.event import Event
1815
from app.models.group import Group
16+
from app.models.role import Role
17+
from app.models.user import User
1918
from app.models.user_follow_group import UserFollowGroup
2019
from app.models.users_groups_role import UsersGroupsRoles
2120

app/api/helpers/calendar/ical.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
from urllib.parse import quote
22

33
import pytz
4-
from app.api.helpers.utilities import remove_html_tags
54
from flask import jsonify
65
from flask_jwt_extended import current_user
76
from icalendar import Calendar, Event, Timezone
87
from sqlalchemy import or_
98
from sqlalchemy.orm import joinedload
109

10+
from app.api.helpers.utilities import remove_html_tags
1111
from app.models.session import Session
1212

1313

0 commit comments

Comments
 (0)