From 3c8f1c58c551d8cc227b06fd142449e0df42d84a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Tue, 23 May 2017 05:56:29 +0100 Subject: [PATCH] Use transaction.atomic instead of lock_table lock_table used LOCK which is mysql-specific --- gestioncof/petits_cours_views.py | 44 +++++++++++++++----------------- gestioncof/shared.py | 29 --------------------- 2 files changed, 21 insertions(+), 52 deletions(-) diff --git a/gestioncof/petits_cours_views.py b/gestioncof/petits_cours_views.py index 3fa0dc57..087c9cef 100644 --- a/gestioncof/petits_cours_views.py +++ b/gestioncof/petits_cours_views.py @@ -12,15 +12,15 @@ from django.views.decorators.csrf import csrf_exempt from django.conf import settings from django.contrib.auth.decorators import login_required from django.contrib import messages +from django.db import transaction from gestioncof.models import CofProfile from gestioncof.petits_cours_models import ( PetitCoursDemande, PetitCoursAttribution, PetitCoursAttributionCounter, - PetitCoursAbility, PetitCoursSubject + PetitCoursAbility ) from gestioncof.petits_cours_forms import DemandeForm, MatieresFormSet from gestioncof.decorators import buro_required -from gestioncof.shared import lock_table, unlock_tables class DemandeListView(ListView): @@ -274,17 +274,17 @@ def _traitement_post(request, demande): headers={'Reply-To': replyto})) connection = mail.get_connection(fail_silently=False) connection.send_messages(mails_to_send) - lock_table(PetitCoursAttributionCounter, PetitCoursAttribution, User) - for matiere in proposals: - for rank, user in enumerate(proposals[matiere]): - counter = PetitCoursAttributionCounter.objects.get(user=user, - matiere=matiere) - counter.count += 1 - counter.save() - attrib = PetitCoursAttribution(user=user, matiere=matiere, - demande=demande, rank=rank + 1) - attrib.save() - unlock_tables() + with transaction.atomic(): + for matiere in proposals: + for rank, user in enumerate(proposals[matiere]): + counter = PetitCoursAttributionCounter.objects.get( + user=user, matiere=matiere + ) + counter.count += 1 + counter.save() + attrib = PetitCoursAttribution(user=user, matiere=matiere, + demande=demande, rank=rank + 1) + attrib.save() demande.traitee = True demande.traitee_par = request.user demande.processed = datetime.now() @@ -309,17 +309,15 @@ def inscription(request): profile.petits_cours_accept = "receive_proposals" in request.POST profile.petits_cours_remarques = request.POST["remarques"] profile.save() - lock_table(PetitCoursAttributionCounter, PetitCoursAbility, User, - PetitCoursSubject) - abilities = ( - PetitCoursAbility.objects.filter(user=request.user).all() - ) - for ability in abilities: - PetitCoursAttributionCounter.get_uptodate( - ability.user, - ability.matiere + with transaction.atomic(): + abilities = ( + PetitCoursAbility.objects.filter(user=request.user).all() ) - unlock_tables() + for ability in abilities: + PetitCoursAttributionCounter.get_uptodate( + ability.user, + ability.matiere + ) success = True formset = MatieresFormSet(instance=request.user) else: diff --git a/gestioncof/shared.py b/gestioncof/shared.py index 63aceae5..e4180b49 100644 --- a/gestioncof/shared.py +++ b/gestioncof/shared.py @@ -1,15 +1,8 @@ -# -*- coding: utf-8 -*- - -from __future__ import division -from __future__ import print_function -from __future__ import unicode_literals - from django.contrib.sites.models import Site from django.conf import settings from django_cas_ng.backends import CASBackend from django_cas_ng.utils import get_cas_client from django.contrib.auth import get_user_model -from django.db import connection from gestioncof.models import CofProfile @@ -74,25 +67,3 @@ def context_processor(request): "site": Site.objects.get_current(), } return data - - -def lock_table(*models): - query = "LOCK TABLES " - for i, model in enumerate(models): - table = model._meta.db_table - if i > 0: - query += ", " - query += "%s WRITE" % table - cursor = connection.cursor() - cursor.execute(query) - row = cursor.fetchone() - return row - - -def unlock_tables(*models): - cursor = connection.cursor() - cursor.execute("UNLOCK TABLES") - row = cursor.fetchone() - return row - -unlock_table = unlock_tables