views.py 13.1 KB
Newer Older
Administrator committed
1 2 3 4
from outils.common_imports import *
from outils.for_view_imports import *
from outils.common import Verification

5
from shifts.models import CagetteShift
Damien Moulard committed
6
from members.models import CagetteMember
7
import shifts.fonctions
Administrator committed
8 9 10 11

tz = pytz.timezone("Europe/Paris")


12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
def _is_middled_filled_considered(reserved, max):
    """Added to fit with new LaCagette need. (based on num rather than %)."""
    answer = False
    toggle_num = 0
    try:
        toggle_num = int(getattr(settings, 'SHIFT_COLOR_TOGGLE_NUM', 0))
    except:
        coop_logger.warning("Wrong value for SHIFT_COLOR_TOGGLE_NUM : %s",
                            str(getattr(settings, 'SHIFT_COLOR_TOGGLE_NUM', 0))
                            )
    if toggle_num == 0:
        if int(reserved) / int(max) < 0.5:
            answer = True
    else:
        answer = int(reserved) <= toggle_num
    return answer


Administrator committed
30 31
def get_list_shift_calendar(request, partner_id):
    cs = CagetteShift()
32
    [registerPartner, is_ftop] = shifts.fonctions.get_shift_partner(cs.o_api, partner_id)
Administrator committed
33

34
    remove_15_minutes_at_shift_end = getattr(settings, 'REMOVE_15_MINUTES_AT_SHIFT_END', True)
Administrator committed
35
    listRegisterPartner = []
Etienne Freiss committed
36
    listMakeUpShift = []
Administrator committed
37 38
    for v in registerPartner:
        listRegisterPartner.append(v['id'])
Etienne Freiss committed
39 40
        if v['is_makeup']:
            listMakeUpShift.append(v['id'])
Administrator committed
41 42 43

    start = request.GET.get('start')
    end = request.GET.get('end')
44
    listService = cs.get_shift_calendar(is_ftop, start, end)
Administrator committed
45 46 47

    events = []
    for value in listService:
48
        if value['shift_type_id'][0] == 1 or getattr(settings, 'USE_STANDARD_SHIFT', True) is False:
49
            #  Standard ou volant si on n'utilise pas les services standards (config)
Administrator committed
50 51 52 53 54 55
            l = set(value['registration_ids']) & set(listRegisterPartner)
            # if (int(value['seats_reserved']) == int(value['seats_max']) and len(l) > 0 ) or (int(value['seats_reserved']) < int(value['seats_max'])):
            if (int(value['seats_available']) > 0 or len(l) > 0 ):
                event = {}
                event["id"] = value['id']
                smax = int(value['seats_available']) + int(value['seats_reserved'])
56
 
Damien Moulard committed
57
                company_code = getattr(settings, 'COMPANY_CODE', '')
Félicie committed
58
                title_prefix = ''
Damien Moulard committed
59
                if company_code != "lacagette" and len(value['address_id']) == 2 and ',' in value['address_id'][1]:
Félicie committed
60
                    title_prefix = str(value['address_id'][1]).split(",")[1] + " --"
Damien Moulard committed
61
                elif company_code == "lacagette":
62
                    title_prefix = " - "
63

Administrator committed
64 65
                event["title"] = title_prefix + str(value['seats_reserved']) + "/" + str(smax)

Félicie committed
66

67
                event["start"] = shifts.fonctions.dateIsoUTC(value['date_begin_tz'])
Félicie committed
68

69
                datetime_object = datetime.datetime.strptime(value['date_end_tz'], "%Y-%m-%d %H:%M:%S") - datetime.timedelta(minutes=15)
70 71
                if remove_15_minutes_at_shift_end is True:
                    datetime_object -= datetime.timedelta(minutes=15)
72
                event["end"] = shifts.fonctions.dateIsoUTC(datetime_object.strftime("%Y-%m-%d %H:%M:%S"))
Administrator committed
73 74

                if len(l) > 0:
Yvon Kerdoncuff committed
75 76
                    if set(value['registration_ids']) & set(listRegisterPartner) & set(listMakeUpShift):
                        event["classNames"] = ["shift_booked_makeup"]
77
                    else:
Yvon Kerdoncuff committed
78
                        event["classNames"] = ["shift_booked"]
Administrator committed
79 80 81 82 83
                    event["changed"] = False
                # elif int(value['seats_reserved']) == int(value['seats_max']):
                #     event["className"] = "shift_full"
                #     event["changed"] = False
                elif int(value['seats_reserved']) == 0:
Yvon Kerdoncuff committed
84
                    event["classNames"] = ["shift_empty"]
Administrator committed
85
                    event["changed"] = True
86
                elif _is_middled_filled_considered(value['seats_reserved'], smax) is True:
Yvon Kerdoncuff committed
87
                    event["classNames"] = ["shift_less_alf"]
Administrator committed
88 89
                    event["changed"] = True
                else:
Yvon Kerdoncuff committed
90
                    event["classNames"] = ["shift_other"]
Administrator committed
91 92 93 94 95 96 97 98 99 100
                    event["changed"] = True

                event["registration_ids"] = value['registration_ids']
                events.append(event)

    response = JsonResponse(events, safe=False)
    return response

def get_list_shift_partner(request, partner_id):
    cs = CagetteShift()
101
    [shiftData, is_ftop] = shifts.fonctions.get_shift_partner(cs.o_api, partner_id)
102

Administrator committed
103 104 105
    for value in shiftData:
        value['date_begin'] = value['date_begin'] + "Z"
        value['date_end'] = value['date_end'] + "Z"
106

Administrator committed
107 108 109 110 111 112 113 114 115 116
    return JsonResponse(shiftData, safe=False)

def change_shift(request):
    if 'verif_token' in request.POST:
        if Verification.verif_token(request.POST.get('verif_token'), int(request.POST.get('idPartner'))) is True:

            cs = CagetteShift()

            if 'idNewShift' in request.POST and 'idOldShift' in request.POST:
                idOldShift = request.POST['idOldShift']
117
                listRegister = [int(request.POST['idRegister'])]
118 119
                data = {
                    "idPartner": int(request.POST['idPartner']),
120
                    "idShift": int(request.POST['idNewShift']),
121
                    "shift_type": request.POST['shift_type'],
122 123
                    "is_makeup": cs.shift_is_makeup(listRegister[0]),
                    "origin": "Espace membre : changement de service"
124 125 126 127 128 129 130 131 132 133 134 135 136 137
                }
                
                should_block_service_exchange = getattr(settings, 'BLOCK_SERVICE_EXCHANGE_24H_BEFORE', False)
                if should_block_service_exchange:
                    # Block change if old shift is to happen in less than 24 hours
                    now = datetime.datetime.now(tz)

                    old_shift = cs.get_shift(idOldShift)
                    day_before_old_shift_date_start = tz.localize(datetime.datetime.strptime(old_shift['date_begin_tz'], '%Y-%m-%d %H:%M:%S') - datetime.timedelta(hours=24))

                    if now > day_before_old_shift_date_start:
                        response = {'msg': "Old service in less than 24hours."}
                        return JsonResponse(response, status=400)

Administrator committed
138 139 140
                st_r_id = False
                #Insertion du nouveau shift
                try:
141
                    st_r_id, res_decrement = cs.set_shift(data)
Administrator committed
142 143 144
                except Exception as e:
                    coop_logger.error("Change shift : %s, %s", str(e), str(data))
                if st_r_id:
145
                    reg_ids = [int(request.POST['idRegister'])]
146 147

                    # Annule l'ancien shift
148 149 150 151 152 153
                    c_o = "Espace membre",
                    c_d = "Déplacement de shift"
                    if data['is_makeup']:
                        cs.unselect_makeup(reg_ids, cancellation_origin=c_o, cancellation_description=c_d)
                    else:
                        cs.cancel_shift(reg_ids, cancellation_origin=c_o, cancellation_description=c_d)
Administrator committed
154 155 156

                    response = {'result': True}
                else:
Félicie committed
157 158
                    response = {'msg': "Fail to create shift"}
                    return JsonResponse(response, status=500)
Administrator committed
159
            else:
Félicie committed
160 161
                response = {'msg': "Bad arguments"}
                return JsonResponse(response, status=400)
Administrator committed
162 163 164 165 166 167
            return JsonResponse(response)
        else:
            return HttpResponseForbidden()
    else:
        return HttpResponseForbidden()

Etienne Freiss committed
168 169 170 171 172
def affect_shift(request):
    if 'verif_token' in request.POST:
        if Verification.verif_token(request.POST.get('verif_token'), int(request.POST.get('idPartner'))) is True:
            cs = CagetteShift()
            if 'idShiftRegistration' in request.POST and 'affected_partner' in request.POST:
173 174
                #  if request is made by associated people, idPartner is it's id, not "master" res.partner
                #  it's will be handled in model's method (affect_shift)
Etienne Freiss committed
175 176 177 178 179
                data = {
                    "idPartner": int(request.POST['idPartner']),
                    "idShiftRegistration": int(request.POST['idShiftRegistration']),
                    "affected_partner": request.POST['affected_partner'],
                }
180
                st_r_id = None
Etienne Freiss committed
181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198
                try:
                    st_r_id = cs.affect_shift(data)
                except Exception as e:
                    coop_logger.error("affect shift : %s, %s", str(e), str(data))
                if st_r_id:
                    response = {'result': True}
                else:
                    response = {'msg': "Internal Error"}
                    return JsonResponse(response, status=500)
                return(JsonResponse({'result': True}))
            else:
                response = {'msg': "Bad args"}
                return JsonResponse(response, status=400)
        else:
            return HttpResponseForbidden()
    else:
        return HttpResponseForbidden()

Administrator committed
199 200 201 202 203 204
def add_shift(request):
    if 'verif_token' in request.POST:
        if Verification.verif_token(request.POST.get('verif_token'), int(request.POST.get('idPartner'))) is True:
            cs = CagetteShift()

            if 'idNewShift' in request.POST and 'idPartner' in request.POST:
205 206
                partner_id = int(request.POST['idPartner'])
                id_shift = int(request.POST['idNewShift'])
207
                data = {
208 209 210
                    "idPartner": partner_id, 
                    "idShift": id_shift, 
                    "shift_type": request.POST['shift_type'],
211 212
                    "is_makeup": False,
                    "origin": "Espace membre : ajout de service"
213
                }
214 215 216

                if 'is_makeup' in request.POST and request.POST['is_makeup'] == "1":
                    data['is_makeup'] = True
217
                    data['origin'] = "Espace membre : sélection de rattrapage"
218
                
Administrator committed
219 220 221
                #Insertion du nouveau shift
                st_r_id = False
                try:
222
                    st_r_id, res_decrement = cs.set_shift(data)
Administrator committed
223 224
                except Exception as e:
                    coop_logger.error("Add shift : %s, %s", str(e), str(data))
225

Administrator committed
226
                if st_r_id:
227
                    response = {'result': True, 'decrement_makeups' : res_decrement}
Administrator committed
228 229 230 231 232 233 234 235 236 237
                else:
                    response = {'result': False}
            else:
                response = {'result': False}
            return JsonResponse(response)
        else:
            return HttpResponseForbidden()
    else:
        return HttpResponseForbidden()

238
def cancel_shift_case_extra_shift_done(request):
239 240 241 242 243 244 245 246 247 248 249
    """ Annule une présence à un shift """
    if 'verif_token' in request.POST:
        partner_id = int(request.POST.get('idPartner'))
        if Verification.verif_token(request.POST.get('verif_token'), partner_id) is True:

            cs = CagetteShift()
            listRegister = [int(request.POST['idRegister'])]

            try:
                # decrement extra_shift_done if param exists
                if 'extra_shift_done' in request.POST:
250 251 252 253 254 255 256
                    cs.cancel_shift(
                        listRegister,
                        cancellation_origin='Espace membre',
                        cancellation_description='Suite service fait à deux',
                        #To print in counter event in the case when shift is a makeup
                        counter_event_name='Suppression d\'un rattrapage depuis l\'espace membre suite à un service fait à deux.'
                    )
257 258 259 260 261 262 263 264 265
                    target = int(request.POST["extra_shift_done"]) - 1

                    # extra security
                    if target < 0:
                        target = 0

                    cm = CagetteMember(partner_id)
                    cm.update_extra_shift_done(target)

266 267 268 269
                    return JsonResponse({"res": 'response'})

                return JsonResponse({"error" : "Cette méthode ne peut être appelée que pour annuler"
                                                   "un service suite à un service fait à deux"}, status=500)
270 271 272 273 274 275 276
            except Exception as e:
                return JsonResponse({"error" : str(e)}, status=500)
        else:
            return HttpResponseForbidden()
    else:
        return HttpResponseForbidden()

Administrator committed
277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305
def reset_members_positive_points(request):
    """Called by a cron script"""
    return JsonResponse({'res': CagetteShift.reset_members_positive_points()})

def get_test(request):
    cs = CagetteShift()

    fields = ['shift_ticket_ids', 'shift_type_id']  # res.partner
    cond = []
    # cond = [['partner_id','=',1522],['start_date','<',datetime.datetime.now().isoformat()],['stop_date','>',datetime.datetime.now().isoformat()]]
    # registerPartner = cs.get_test('shift.shift',cond,fields)
    registerPartner =  cs.get_shift_calendar(1018)  # cs.get_data_partner(1538)

    response = JsonResponse(registerPartner, safe=False)
    return response
    #return  HttpResponse(shiftData)

def get_list(request):
    cs = CagetteShift()

    fields = ['cooperative_state']  # res.partner
    cond = []
    registerPartner = cs.get_test('res.partner', cond, fields)
    liste = []
    for val in registerPartner:
        if val[fields[0]] not in liste:
            liste.append(val[fields[0]])

    return JsonResponse(liste, safe=False)
306 307 308 309

def get_current_cycle_week(request):
    cs = CagetteShift()
    return JsonResponse(cs.get_current_cycle_week_data(), safe=False)