aboutsummaryrefslogtreecommitdiffstats
path: root/accounts/views.py
diff options
context:
space:
mode:
authorAndrea Lepori <aleporia@gmail.com>2023-07-24 18:31:02 +0200
committerAndrea Lepori <aleporia@gmail.com>2023-07-24 18:31:03 +0200
commit0de1f0a309c62a9e6dd9eb48e38b32c552e09c6c (patch)
treeabf8cbe64e242ffd7d29bfc9ae733531cee72891 /accounts/views.py
parentimprove index show multiple peoples (diff)
downloadscout-subs-0de1f0a309c62a9e6dd9eb48e38b32c552e09c6c.tar.gz
scout-subs-0de1f0a309c62a9e6dd9eb48e38b32c552e09c6c.zip
create new persons and edit
Diffstat (limited to 'accounts/views.py')
-rw-r--r--accounts/views.py399
1 files changed, 399 insertions, 0 deletions
diff --git a/accounts/views.py b/accounts/views.py
index 8ea48f2..35dca92 100644
--- a/accounts/views.py
+++ b/accounts/views.py
@@ -755,6 +755,405 @@ def personal_wrapper(request, errors):
return render(request, 'accounts/index.html', context)
+@login_required
+def edit(request, code):
+ errors = []
+ context = {}
+ ok_message = ""
+ personal_active = "active"
+ medic_active = ""
+ settings_active = ""
+ # additional user information
+ if (code == 0):
+ # generate code
+ while (True):
+ code = randint(100000, 999999)
+ if len(UserCode.objects.filter(code=code)) == 0:
+ break
+ medic = MedicalData()
+ medic.save()
+ userCode = UserCode(user=request.user, code=code, medic=medic)
+ userCode.save()
+
+ usercode = UserCode.objects.filter(user=request.user, code=code)
+
+ if (len(usercode) == 0):
+ # code is not authorised for this user
+ return
+
+ usercode = usercode[0]
+
+ # medical info
+ medic = usercode.medic
+ # values for multiple choice box
+ # TODO remove multiple choice
+ branca_default = ""
+ branca_castorini = ""
+ branca_lupetti = ""
+ branca_esploratori = ""
+ branca_pionieri = ""
+ branca_rover = ""
+
+ # variables for validation
+ validation_dic = {}
+ required_fields = ["first_name", "last_name", "parent_name", "via", "cap", "country", "nationality", "phone", "avs_number", "emer_name", "emer_relative", "cell_phone", "address", "health_care", "injuries", "rc", "medic_name", "medic_phone", "medic_address"]
+ personal_fields = ["first_name", "last_name", "parent_name", "via", "cap", "country", "nationality", "phone", "avs_number"]
+ medic_fields = ["emer_name", "emer_relative", "cell_phone", "address", "health_care", "injuries", "rc", "medic_name", "medic_phone", "medic_address"]
+
+ if request.method == "POST":
+ # requested download
+ if request.POST['action'] == "download_vac":
+ if medic.vac_certificate != None:
+ filename = os.path.basename(medic.vac_certificate.name)
+ filename = filename[filename.find("_")+1:]
+ if filename.rfind('.') != -1:
+ filename = filename[:filename.rfind('.')]
+ filename = filename + ".jpg"
+
+ # encode in JPEG
+ im = Image.open(medic.vac_certificate.file)
+ im_io = BytesIO()
+ im.save(im_io, 'JPEG', quality=90)
+ im_io.seek(0)
+ return FileResponse(im_io, as_attachment=True, filename=filename)
+
+ elif request.POST['action'] == "download_health":
+ if medic.health_care_certificate != None:
+ filename = os.path.basename(medic.health_care_certificate.name)
+ filename = filename[filename.find("_")+1:]
+ if filename.rfind('.') != -1:
+ filename = filename[:filename.rfind('.')]
+ filename = filename + ".jpg"
+
+ # encode in JPEG
+ im = Image.open(medic.health_care_certificate.file)
+ im_io = BytesIO()
+ im.save(im_io, 'JPEG', quality=90)
+ im_io.seek(0)
+ return FileResponse(im_io, as_attachment=True, filename=filename)
+
+ elif request.POST['action'] == "password":
+ # get form object
+ if request.user.has_usable_password():
+ form2 = PasswordChangeForm(data=request.POST, user=request.user)
+ else:
+ form2 = SetPasswordForm(data=request.POST, user=request.user)
+
+ # if form is valid and terms were accepted save user
+ if form2.is_valid():
+ form2.save()
+ ok_message = "Password modificata con successo"
+ personal_active = ""
+ settings_active = "active"
+ else:
+ personal_active = ""
+ settings_active = "active"
+ for field in form2.errors.as_data().values():
+ for err in field:
+ if err.code == "password_mismatch":
+ errors.append("Le due password non sono uguali")
+ elif err.code == "password_too_similar":
+ errors.append("La password è troppo simile all'username")
+ elif err.code == "password_too_short":
+ errors.append("La password è troppo corta")
+ elif err.code == "password_too_common":
+ errors.append("La password è troppo comune")
+ elif err.code == "password_entirely_numeric":
+ errors.append("La password deve contenere lettere")
+ elif err.code == "password_incorrect":
+ errors.append("La password attuale è incorretta")
+
+ else:
+ # set all attributes
+ usercode.first_name = request.POST["first_name"]
+ usercode.last_name = request.POST["last_name"]
+ usercode.parent_name = request.POST["parent_name"]
+ usercode.via = request.POST["via"]
+ usercode.cap = request.POST["cap"]
+ usercode.country = request.POST["country"]
+ usercode.nationality = request.POST["nationality"]
+ usercode.born_date = dateparser.parse(request.POST["birth_date"])
+ usercode.home_phone = request.POST["home_phone"]
+ usercode.phone = request.POST["phone"]
+ usercode.school = request.POST["school"]
+ usercode.avs_number = request.POST["avs_number"]
+
+ if request.POST["year"].isdigit():
+ usercode.year = request.POST["year"]
+ else:
+ errors.append("L'anno scolastico deve essere un numero")
+
+ usercode.save()
+
+ medic.emer_name = request.POST["emer_name"]
+ medic.emer_relative = request.POST["emer_relative"]
+ medic.cell_phone = request.POST["cell_phone"]
+ medic.address = request.POST["address"]
+ medic.emer_phone = request.POST["emer_phone"]
+ medic.health_care = request.POST["health_care"]
+ medic.injuries = request.POST["injuries"]
+ medic.rc = request.POST["rc"]
+ medic.rega = "rega" in request.POST
+ medic.medic_name = request.POST["medic_name"]
+ medic.medic_phone = request.POST["medic_phone"]
+ medic.medic_address = request.POST["medic_address"]
+ medic.sickness = request.POST["sickness"]
+ medic.vaccine = request.POST["vaccine"]
+ medic.tetanus_date = dateparser.parse(request.POST["tetanus_date"])
+ medic.allergy = request.POST["allergy"]
+ medic.drugs_bool = "drugs_bool" in request.POST
+ medic.drugs = request.POST["drugs"]
+ medic.misc_bool = "misc_bool" in request.POST
+ medic.misc = request.POST["misc"]
+ medic.save()
+
+ missing_fields = False
+ missing_personal_field = False
+
+ if request.POST["birth_date"] == "" or request.POST["birth_date"] == "01 Gennaio 1970" or request.POST["birth_date"] == "None":
+ validation_dic["birth_date"] = 'class="datepicker validate invalid" required="" aria-required="true"'
+ missing_fields = True
+ missing_personal_field = True
+ else:
+ validation_dic["birth_date"] = 'class="datepicker validate" required="" aria-required="true"'
+
+ for i in required_fields:
+ if request.POST[i] == "":
+ missing_fields = True
+ if i in personal_fields:
+ missing_personal_field = True
+ validation_dic[i] = 'class="validate invalid" required="" aria-required="true"'
+ else:
+ validation_dic[i] = 'class="validate" required="" aria-required="true"'
+
+ if missing_fields:
+ errors.append("Alcuni campi richiesti non sono stati compilati")
+ if not missing_personal_field:
+ personal_active = ""
+ medic_active = "active"
+
+ # if "branca" in request.POST:
+ # if request.POST["branca"] != "":
+ # request.user.groups.clear()
+ # request.user.groups.add(
+ # Group.objects.get(name=request.POST["branca"]))
+
+ # check if user uploaded a file
+ if "vac_certificate" in request.FILES:
+ files = request.FILES.getlist('vac_certificate')
+ name = files[0].name
+ try:
+ # if multiple files concatenate pictures
+ im = Image.new("RGB", (0, 0), (255, 255, 255))
+ for f in files:
+ if f.name.endswith(".pdf") or f.name.endswith(".PDF"):
+ images = convert_from_bytes(f.read())
+ for i in images:
+ dst = Image.new('RGB', (max(im.width, i.width), im.height + i.height), (255, 255, 255))
+ dst.paste(im, (0, 0))
+ dst.paste(i, (0, im.height))
+ im = dst
+ else:
+ i = Image.open(f)
+ dst = Image.new('RGB', (max(im.width, i.width), im.height + i.height), (255, 255, 255))
+ dst.paste(im, (0, 0))
+ dst.paste(i, (0, im.height))
+ im = dst
+
+ im_io = BytesIO()
+ # resize image if larger than max value
+ if im.height > 16383:
+ im = im.resize((round(im.width/im.height*16383), 16383))
+ # compress image in WEBP
+ im.save(im_io, 'WEBP', quality=50, method=4)
+ medic.vac_certificate.save(
+ request.user.username+"_"+name, im_io)
+ medic.save()
+ except UnidentifiedImageError:
+ errors.append("Il certificato delle vaccinazioni non è un immagine valida")
+ except PDFPageCountError:
+ errors.append("Il certificato delle vaccinazioni non è un pdf valido")
+ except PDFSyntaxError:
+ errors.append("Il certificato delle vaccinazioni non è un pdf valido")
+ except IOError:
+ errors.append("Il certificato delle vaccinazioni è un immagine troppo grande")
+
+ if "health_care_certificate" in request.FILES:
+ files = request.FILES.getlist('health_care_certificate')
+ name = files[0].name
+ try:
+ # if multiple files concatenate pictures
+ im = Image.new("RGB", (0, 0), (255, 255, 255))
+ for f in files:
+ if f.name.endswith(".pdf") or f.name.endswith(".PDF"):
+ images = convert_from_bytes(f.read())
+ for i in images:
+ dst = Image.new('RGB', (max(im.width, i.width), im.height + i.height), (255, 255, 255))
+ dst.paste(im, (0, 0))
+ dst.paste(i, (0, im.height))
+ im = dst
+ else:
+ i = Image.open(f)
+ dst = Image.new('RGB', (max(im.width, i.width), im.height + i.height), (255, 255, 255))
+ dst.paste(im, (0, 0))
+ dst.paste(i, (0, im.height))
+ im = dst
+
+ im_io = BytesIO()
+ # resize image if larger than max value
+ if im.height > 16383:
+ im = im.resize((round(im.width/im.height*16383), 16383))
+ # compress image in WEBP
+ im.save(im_io, 'WEBP', quality=50, method=4)
+ medic.health_care_certificate.save(
+ request.user.username+"_"+name, im_io)
+ medic.save()
+ except UnidentifiedImageError:
+ errors.append("La tessera della cassa malati non è un immagine valida")
+ except PDFPageCountError:
+ errors.append("La tessera della cassa malati non è un pdf valido")
+ except PDFSyntaxError:
+ errors.append("La tessera della cassa malati non è un pdf valido")
+ except IOError:
+ errors.append("La tessera della cassa malati è un immagine troppo grande")
+
+ # user requested file delete
+ if request.POST["delete_vac"] == 'vac':
+ medic.vac_certificate = None
+ medic.save()
+
+ if request.POST["delete_health"] == 'health':
+ medic.health_care_certificate = None
+ medic.save()
+
+ # if there wasn't any error redirect to clear POST
+ if len(errors) == 0:
+ return HttpResponseRedirect(request.get_full_path())
+
+ else:
+ # no post, create empty validation
+ validation_dic["birth_date"] = 'class="datepicker validate" required="" aria-required="true"'
+ for i in required_fields:
+ validation_dic[i] = 'class="validate" required="" aria-required="true"'
+
+ # check if user is in a group and set multiple choice to that
+ if len(request.user.groups.values_list('name', flat=True)) == 0:
+ branca_default = "selected"
+ else:
+ parent_group = request.user.groups.values_list('name', flat=True)[0]
+ if parent_group == "diga":
+ branca_castorini = "selected"
+ elif parent_group == "muta":
+ branca_lupetti = "selected"
+ elif parent_group == "reparto":
+ branca_esploratori = "selected"
+ elif parent_group == "posto":
+ branca_pionieri = "selected"
+ elif parent_group == "clan":
+ branca_rover = "selected"
+ else:
+ branca_default = "selected"
+
+ # set checkbox status
+ rega = ""
+ if medic.rega:
+ rega = "checked='checked'"
+ drugs = ""
+ if medic.drugs_bool:
+ drugs = "checked='checked'"
+ misc = ""
+ if medic.misc_bool:
+ misc = "checked='checked'"
+
+ # set file name for uploaded files
+ if (medic.vac_certificate != None):
+ vac_name = os.path.basename(medic.vac_certificate.name)
+ vac_name = vac_name[vac_name.find("_")+1:]
+ else:
+ vac_name = ''
+
+ if (medic.health_care_certificate != None):
+ card_name = os.path.basename(medic.health_care_certificate.name)
+ card_name = card_name[card_name.find("_")+1:]
+ else:
+ card_name = ''
+
+ # check if user is connected with midata
+ midata_user = (usercode.midata_id > 0)
+ midata_disable = ""
+
+ # get user info from midata
+ if midata_user:
+ midata_disable = " readonly disabled"
+ if not copy_from_midata(request, usercode):
+ return HttpResponseRedirect(request.get_full_path())
+
+ usable_password = request.user.has_usable_password()
+
+ # check if user has saved the form
+ home_tooltip = False
+ if "saved" in request.GET:
+ # show tooltip only if user is not approved and there are no errors
+ home_tooltip = (not request.user.has_perm("client.approved")) and (len(errors) == 0)
+
+ # fill context
+ context = {
+ 'ucode': code,
+ 'validation_dic': validation_dic,
+ 'first_name': usercode.first_name,
+ 'last_name': usercode.last_name,
+ 'parent_name': usercode.parent_name,
+ 'via': usercode.via,
+ 'cap': usercode.cap,
+ 'country': usercode.country,
+ 'nationality': usercode.nationality,
+ 'birth_date': usercode.born_date,
+ 'home_phone': usercode.home_phone,
+ 'phone': usercode.phone,
+ 'school': usercode.school,
+ 'year': usercode.year,
+ 'avs_number': usercode.avs_number,
+ 'branca_default': branca_default,
+ 'branca_castorini': branca_castorini,
+ 'branca_lupetti': branca_lupetti,
+ 'branca_esploratori': branca_esploratori,
+ 'branca_pionieri': branca_pionieri,
+ 'branca_rover': branca_rover,
+ 'emer_name': medic.emer_name,
+ 'emer_relative': medic.emer_relative,
+ 'cell_phone': medic.cell_phone,
+ 'address': medic.address,
+ 'emer_phone': medic.emer_phone,
+ 'health_care': medic.health_care,
+ 'injuries': medic.injuries,
+ 'rc': medic.rc,
+ 'rega_check': rega,
+ 'medic_name': medic.medic_name,
+ 'medic_phone': medic.medic_phone,
+ 'medic_address': medic.medic_address,
+ 'sickness': medic.sickness,
+ 'vaccine': medic.vaccine,
+ 'tetanus_date': medic.tetanus_date,
+ 'allergy': medic.allergy,
+ 'drugs_check': drugs,
+ 'drugs': medic.drugs,
+ 'misc_check': misc,
+ 'misc': medic.misc,
+ 'health_care_certificate': card_name,
+ 'vac_certificate': vac_name,
+ 'errors': errors,
+ 'ok_message': ok_message,
+ 'midata_user': midata_user,
+ 'midata_disable': midata_disable,
+ 'usable_password': usable_password,
+ 'personal_active': personal_active,
+ 'medic_active': medic_active,
+ 'settings_active': settings_active,
+ 'midata_enabled': MIDATA_ENABLED,
+ 'home_tooltip': home_tooltip,
+ }
+
+ return render(request, 'accounts/user_edit.html', context)
# simple terms page, only static html
def terms(request):