Skip to content

Commit 6875411

Browse files
authored
Merge pull request #4552 from magfest/no-new-sessions
Use existing session where possible
2 parents 2031885 + b63dc36 commit 6875411

File tree

4 files changed

+35
-9
lines changed

4 files changed

+35
-9
lines changed

uber/api.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -778,7 +778,7 @@ def create(self, first_name, last_name, email, params):
778778
Example `params` dictionary for setting extra parameters:
779779
<pre>{"placeholder": "yes", "legal_name": "First Last", "cellphone": "5555555555"}</pre>
780780
"""
781-
with Session() as session:
781+
with Session(create_savepoint=True) as session:
782782
attendee_query = session.query(Attendee).filter(Attendee.first_name.ilike(first_name),
783783
Attendee.last_name.ilike(last_name),
784784
Attendee.email.ilike(email))
@@ -820,7 +820,7 @@ def update(self, id, params):
820820
Example:
821821
<pre>{"first_name": "First", "paid": "doesn't need to", "ribbon": "Volunteer, Panelist"}</pre>
822822
"""
823-
with Session() as session:
823+
with Session(create_savepoint=True) as session:
824824
attendee = session.attendee(id, allow_invalid=True)
825825

826826
if not attendee:

uber/models/__init__.py

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2376,11 +2376,38 @@ def __getattr__(self, name):
23762376
"""
23772377
return getattr(_ScopedSession, name)
23782378

2379-
def __call__(self, *args, **kwargs):
2379+
def __call__(self, create_savepoint=False, *args, **kwargs):
23802380
"""
2381-
Create isolated session, to match old behavior on 'with Session() as session'
2381+
Creates a new session or returns the current session.
2382+
2383+
create_savepoint (bool): Flush the current session to the DB and create a savepoint.
2384+
This lets you use session.rollback() to undo only changes made after the savepoint.
2385+
This is ignored if we're returning a new session.
23822386
"""
2383-
return SessionFactory(*args, **kwargs)
2387+
try:
2388+
req = cherrypy.request
2389+
2390+
if 'bind' not in kwargs:
2391+
if not hasattr(req, 'db_connection'):
2392+
req.db_connection = engine.connect()
2393+
2394+
def release_connection():
2395+
req.db_connection.close()
2396+
req.hooks.attach('on_end_request', release_connection)
2397+
2398+
kwargs['bind'] = req.db_connection
2399+
2400+
session = SessionFactory(*args, **kwargs)
2401+
2402+
if create_savepoint and kwargs.get('bind') == getattr(req, 'db_connection', None) and req.db_connection.in_transaction():
2403+
session.begin_nested()
2404+
2405+
return session
2406+
2407+
except AttributeError:
2408+
# We are outside of a web request (e.g., Celery workers, cron jobs, test scripts)
2409+
# Fall back to standard unmanaged behavior.
2410+
return SessionFactory(*args, **kwargs)
23842411

23852412
Session = HybridSessionProxy()
23862413

uber/site_sections/promo_codes.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,8 @@ def add_promo_code_words(self, session, text='', part_of_speech=0):
3636
text = text.strip()
3737
words = []
3838
if text:
39-
with Session() as session:
40-
old_words = set(s for (s,) in session.query(PromoCodeWord.normalized_word).filter(
41-
PromoCodeWord.part_of_speech == part_of_speech).all())
39+
old_words = set(s for (s,) in session.query(PromoCodeWord.normalized_word).filter(
40+
PromoCodeWord.part_of_speech == part_of_speech).all())
4241

4342
for word in [s for s in shlex.split(text.replace(',', ' ')) if s]:
4443
if PromoCodeWord.normalize_word(word) not in old_words:

uber/utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2109,7 +2109,7 @@ def attendee_import(import_job):
21092109
from uber.models import Attendee, AttendeeAccount, DeptMembership, DeptRole
21102110
from functools import partial
21112111

2112-
with uber.models.Session() as session:
2112+
with uber.models.Session(create_savepoint=True) as session:
21132113
service, message, target_url = get_api_service_from_server(import_job.target_server,
21142114
import_job.api_token)
21152115

0 commit comments

Comments
 (0)