Revision 8cf9b2dd snf-astakos-app/astakos/im/views.py

b/snf-astakos-app/astakos/im/views.py
108 108
from astakos.im import settings as astakos_settings
109 109
from astakos.im.api.callpoint import AstakosCallpoint
110 110
from astakos.im import auth_providers
111
from astakos.im.project_xctx import project_transaction_context
111 112

  
112 113
logger = logging.getLogger(__name__)
113 114

  
......
913 914
        'im/how_it_works.html',
914 915
        context_instance=get_context(request))
915 916

  
916
@transaction.commit_manually
917
@project_transaction_context()
917 918
def _create_object(request, model=None, template_name=None,
918 919
        template_loader=template_loader, extra_context=None, post_save_redirect=None,
919 920
        login_required=False, context_processors=None, form_class=None,
920
        msg=None):
921
        msg=None, ctx=None):
921 922
    """
922 923
    Based of django.views.generic.create_update.create_object which displays a
923 924
    summary page before creating the object.
924 925
    """
925
    rollback = False
926 926
    response = None
927 927

  
928 928
    if extra_context is None: extra_context = {}
......
954 954
    except BaseException, e:
955 955
        logger.exception(e)
956 956
        messages.error(request, _(astakos_messages.GENERIC_ERROR))
957
        rollback = True
957
        if ctx:
958
            ctx.mark_rollback()
958 959
    finally:
959
        if rollback:
960
            transaction.rollback()
961
        else:
962
            transaction.commit()
963

  
964 960
        if response == None:
965 961
            # Create the template, context, response
966 962
            if not template_name:
......
974 970
            response = HttpResponse(t.render(c))
975 971
        return response
976 972

  
977
@transaction.commit_manually
973
@project_transaction_context()
978 974
def _update_object(request, model=None, object_id=None, slug=None,
979 975
        slug_field='slug', template_name=None, template_loader=template_loader,
980 976
        extra_context=None, post_save_redirect=None, login_required=False,
981 977
        context_processors=None, template_object_name='object',
982
        form_class=None, msg=None):
978
        form_class=None, msg=None, ctx=None):
983 979
    """
984 980
    Based of django.views.generic.create_update.update_object which displays a
985 981
    summary page before updating the object.
986 982
    """
987
    rollback = False
988 983
    response = None
989 984

  
990 985
    if extra_context is None: extra_context = {}
......
1017 1012
    except BaseException, e:
1018 1013
        logger.exception(e)
1019 1014
        messages.error(request, _(astakos_messages.GENERIC_ERROR))
1020
        rollback = True
1015
        ctx.mark_rollback()
1021 1016
    finally:
1022
        if rollback:
1023
            transaction.rollback()
1024
        else:
1025
            transaction.commit()
1026 1017
        if response == None:
1027 1018
            if not template_name:
1028 1019
                template_name = "%s/%s_form.html" %\
......
1132 1123
@require_http_methods(["GET", "POST"])
1133 1124
@signed_terms_required
1134 1125
@login_required
1135
@transaction.commit_on_success
1136 1126
def project_app(request, application_id):
1137 1127
    return common_detail(request, application_id, is_chain=False)
1138 1128

  
1139 1129
@require_http_methods(["GET", "POST"])
1140 1130
@signed_terms_required
1141 1131
@login_required
1142
@transaction.commit_on_success
1143 1132
def project_detail(request, chain_id):
1144 1133
    return common_detail(request, chain_id)
1145 1134

  
1146
def addmembers(request, chain_id):
1135
@project_transaction_context(sync=True)
1136
def addmembers(request, chain_id, ctx=None):
1147 1137
    addmembers_form = AddProjectMembersForm(
1148 1138
        request.POST,
1149 1139
        chain_id=int(chain_id),
1150 1140
        request_user=request.user)
1151 1141
    if addmembers_form.is_valid():
1152 1142
        try:
1153
            rollback = False
1154 1143
            chain_id = int(chain_id)
1155 1144
            map(lambda u: enroll_member(
1156 1145
                    chain_id,
......
1160 1149
        except (IOError, PermissionDenied), e:
1161 1150
            messages.error(request, e)
1162 1151
        except BaseException, e:
1163
            rollback = True
1152
            if ctx:
1153
                ctx.mark_rollback()
1164 1154
            messages.error(request, e)
1165
        finally:
1166
            if rollback == True:
1167
                transaction.rollback()
1168
            else:
1169
                transaction.commit()
1170 1155

  
1171 1156
def common_detail(request, chain_or_app_id, is_chain=True):
1172 1157
    if is_chain:
......
1265 1250
@require_http_methods(["POST", "GET"])
1266 1251
@signed_terms_required
1267 1252
@login_required
1268
@transaction.commit_manually
1269
def project_join(request, chain_id):
1253
@project_transaction_context(sync=True)
1254
def project_join(request, chain_id, ctx=None):
1270 1255
    next = request.GET.get('next')
1271 1256
    if not next:
1272 1257
        next = reverse('astakos.im.views.project_detail',
1273 1258
                       args=(chain_id,))
1274 1259

  
1275
    rollback = False
1276 1260
    try:
1277 1261
        chain_id = int(chain_id)
1278 1262
        join_project(chain_id, request.user)
......
1283 1267
    except BaseException, e:
1284 1268
        logger.exception(e)
1285 1269
        messages.error(request, _(astakos_messages.GENERIC_ERROR))
1286
        rollback = True
1287
    finally:
1288
        if rollback:
1289
            transaction.rollback()
1290
        else:
1291
            transaction.commit()
1270
        if ctx:
1271
            ctx.mark_rollback()
1292 1272
    next = restrict_next(next, domain=COOKIE_DOMAIN)
1293 1273
    return redirect(next)
1294 1274

  
1295 1275
@require_http_methods(["POST"])
1296 1276
@signed_terms_required
1297 1277
@login_required
1298
@transaction.commit_manually
1299
def project_leave(request, chain_id):
1278
@project_transaction_context(sync=True)
1279
def project_leave(request, chain_id, ctx=None):
1300 1280
    next = request.GET.get('next')
1301 1281
    if not next:
1302 1282
        next = reverse('astakos.im.views.project_list')
1303 1283

  
1304
    rollback = False
1305 1284
    try:
1306 1285
        chain_id = int(chain_id)
1307 1286
        leave_project(chain_id, request.user)
......
1310 1289
    except BaseException, e:
1311 1290
        logger.exception(e)
1312 1291
        messages.error(request, _(astakos_messages.GENERIC_ERROR))
1313
        rollback = True
1314
    finally:
1315
        if rollback:
1316
            transaction.rollback()
1317
        else:
1318
            transaction.commit()
1319

  
1292
        if ctx:
1293
            ctx.mark_rollback()
1320 1294
    next = restrict_next(next, domain=COOKIE_DOMAIN)
1321 1295
    return redirect(next)
1322 1296

  
1323 1297
@require_http_methods(["POST"])
1324 1298
@signed_terms_required
1325 1299
@login_required
1326
@transaction.commit_manually
1327
def project_cancel(request, chain_id):
1300
@project_transaction_context()
1301
def project_cancel(request, chain_id, ctx=None):
1328 1302
    next = request.GET.get('next')
1329 1303
    if not next:
1330 1304
        next = reverse('astakos.im.views.project_list')
1331 1305

  
1332
    rollback = False
1333 1306
    try:
1334 1307
        chain_id = int(chain_id)
1335 1308
        cancel_membership(chain_id, request.user)
......
1338 1311
    except BaseException, e:
1339 1312
        logger.exception(e)
1340 1313
        messages.error(request, _(astakos_messages.GENERIC_ERROR))
1341
        rollback = True
1342
    finally:
1343
        if rollback:
1344
            transaction.rollback()
1345
        else:
1346
            transaction.commit()
1314
        if ctx:
1315
            ctx.mark_rollback()
1347 1316

  
1348 1317
    next = restrict_next(next, domain=COOKIE_DOMAIN)
1349 1318
    return redirect(next)
......
1351 1320
@require_http_methods(["POST"])
1352 1321
@signed_terms_required
1353 1322
@login_required
1354
@transaction.commit_manually
1355
def project_accept_member(request, chain_id, user_id):
1356
    rollback = False
1323
@project_transaction_context(sync=True)
1324
def project_accept_member(request, chain_id, user_id, ctx=None):
1357 1325
    try:
1358 1326
        chain_id = int(chain_id)
1359 1327
        user_id = int(user_id)
......
1363 1331
    except BaseException, e:
1364 1332
        logger.exception(e)
1365 1333
        messages.error(request, _(astakos_messages.GENERIC_ERROR))
1366
        rollback = True
1334
        if ctx:
1335
            ctx.mark_rollback()
1367 1336
    else:
1368 1337
        realname = m.person.realname
1369 1338
        msg = _(astakos_messages.USER_JOINED_PROJECT) % locals()
1370 1339
        messages.success(request, msg)
1371
    finally:
1372
        if rollback:
1373
            transaction.rollback()
1374
        else:
1375
            transaction.commit()
1376 1340
    return redirect(reverse('project_detail', args=(chain_id,)))
1377 1341

  
1378 1342
@require_http_methods(["POST"])
1379 1343
@signed_terms_required
1380 1344
@login_required
1381
@transaction.commit_manually
1382
def project_remove_member(request, chain_id, user_id):
1383
    rollback = False
1345
@project_transaction_context(sync=True)
1346
def project_remove_member(request, chain_id, user_id, ctx=None):
1384 1347
    try:
1385 1348
        chain_id = int(chain_id)
1386 1349
        user_id = int(user_id)
......
1390 1353
    except BaseException, e:
1391 1354
        logger.exception(e)
1392 1355
        messages.error(request, _(astakos_messages.GENERIC_ERROR))
1393
        rollback = True
1356
        if ctx:
1357
            ctx.mark_rollback()
1394 1358
    else:
1395 1359
        realname = m.person.realname
1396 1360
        msg = _(astakos_messages.USER_LEFT_PROJECT) % locals()
1397 1361
        messages.success(request, msg)
1398
    finally:
1399
        if rollback:
1400
            transaction.rollback()
1401
        else:
1402
            transaction.commit()
1403 1362
    return redirect(reverse('project_detail', args=(chain_id,)))
1404 1363

  
1405 1364
@require_http_methods(["POST"])
1406 1365
@signed_terms_required
1407 1366
@login_required
1408
@transaction.commit_manually
1409
def project_reject_member(request, chain_id, user_id):
1410
    rollback = False
1367
@project_transaction_context()
1368
def project_reject_member(request, chain_id, user_id, ctx=None):
1411 1369
    try:
1412 1370
        chain_id = int(chain_id)
1413 1371
        user_id = int(user_id)
......
1417 1375
    except BaseException, e:
1418 1376
        logger.exception(e)
1419 1377
        messages.error(request, _(astakos_messages.GENERIC_ERROR))
1420
        rollback = True
1378
        if ctx:
1379
            ctx.mark_rollback()
1421 1380
    else:
1422 1381
        realname = m.person.realname
1423 1382
        msg = _(astakos_messages.USER_LEFT_PROJECT) % locals()
1424 1383
        messages.success(request, msg)
1425
    finally:
1426
        if rollback:
1427
            transaction.rollback()
1428
        else:
1429
            transaction.commit()
1430 1384
    return redirect(reverse('project_detail', args=(chain_id,)))
1431 1385

  
1432 1386
def landing(request):

Also available in: Unified diff