def get_or_create_user(self, request = None, username = None, password = None): ''' Retrieves the user from the Django DB. If the user is not found in the DB, then it tries to retrieve him from dionysos.teilar.gr ''' try: student = Cronos(username, password) ''' Try to pull the user from the Django DB ''' user = User.objects.get(username = username) ''' skip dionysos authentication if the user is one of the listed ADMINS ''' if user.username in get_admins_usernames(): if user.check_password(password): return user else: return ''' If the user is found in the DB, try to login with those credentials in dionysos.teilar.gr ''' try: student.dionysos_auth_login(request) except LoginError: ''' Authentication failed ''' return except CronosError: ''' Connection issue with dionysos.teilar.gr. Try to authenticate with the password stored in the DB instead ''' if password != decrypt_password(user.get_profile().dionysos_password): return except User.DoesNotExist: ''' If the user is not in the DB, try to log in with his dionysos.teilar.gr account ''' try: student.dionysos_auth_login(request, personal_data = True, declaration = True, grades = True) ''' The credentials worked, try to create a user based on those credentials ''' student.get_dionysos_account(request) try: ''' Relate the webscraped school name with the one stored in the DB ''' student.dionysos_school = Departments.objects.get(name = student.dionysos_school) except Exception as error: logger_syslog.error(error, extra = log_extra_data(request)) logger_mail.exception(error) raise CronosError(u'Αδυναμία ανάκτησης της σχολής') user = self.add_student_to_db(request, student) except CronosError: raise except LoginError: ''' Authentication failed ''' return return user
def settings_accounts(request): ''' The user's accounts settings webpage ''' notification = {} eclass_credentials_form = EclassCredentialsForm() webmail_form = WebmailForm() declaration_form = DeclarationForm() grades_form = GradesForm() eclass_lessons_form = EclassLessonsForm() if request.user.get_profile().dionysos_password: raw_dionysos_password = decrypt_password(request.user.get_profile().dionysos_password), else: raw_dionysos_password = None student = Cronos( request.user.get_profile().dionysos_username, raw_dionysos_password, ) if request.user.get_profile().eclass_username: student.eclass_username = request.user.get_profile().eclass_username student.eclass_password = decrypt_password(request.user.get_profile().eclass_password) if request.method == 'POST': if request.POST.get('eclass_password'): ''' Update eclass credentials ''' try: eclass_credentials_form = EclassCredentialsForm(request.POST) student.eclass_password = request.POST.get('eclass_password') if not request.user.get_profile().eclass_username: if eclass_credentials_form.is_valid(): student.eclass_username = request.POST.get('eclass_username') else: raise LoginError try: ''' Check if the e-class.teilar.gr credentials already exist in the DB, but belong to another student's account ''' user = User.objects.get(userprofile__eclass_username = student.eclass_username) if user.username != request.user.username: raise CronosError(u'Τα στοιχεία e-class.teilar.gr ανήκουν ήδη σε κάποιον άλλο λογαριασμό') except User.DoesNotExist: pass ''' Try to login with those credentials, and update eclass lessons afterwards ''' student.get_eclass_lessons(request) ''' Login succeeded, save eclass credentials to the user's profile ''' request.user.get_profile().eclass_username = student.eclass_username request.user.get_profile().eclass_password = encrypt_password(student.eclass_password) request.user.get_profile().save() notification['success'] = u'Η ανανέωση των στοιχείων openclass.teilar.gr ήταν επιτυχής' except (CronosError, LoginError) as error: notification['error'] = error.value elif request.POST.get('webmail_password'): ''' Update webmail credentials ''' try: webmail_form = WebmailForm(request.POST) webmail_password = request.POST.get('webmail_password') if request.user.get_profile().webmail_username: webmail_username = request.user.get_profile().webmail_username else: if not webmail_form.is_valid(): raise LoginError webmail_username = request.POST.get('webmail_username') try: ''' Check if the myweb.teilar.gr credentials already exist in the DB, but belong to another student's account ''' user = User.objects.get(userprofile__webmail_username = webmail_username) if user.username != request.user.username: raise CronosError(u'Τα στοιχεία webmail.teilar.gr ανήκουν ήδη σε κάποιον άλλο λογαριασμό') except User.DoesNotExist: user = None if not user: user = UserProfile.objects.get(pk=request.user.id) user.webmail_username = webmail_username user.webmail_password = encrypt_password(webmail_password) ''' Login was successful, add in DB ''' user.save() notification['success'] = u'Η ανανέωση των στοιχείων myweb.teilar.gr ήταν επιτυχής' except (CronosError, LoginError) as error: notification['error'] = error.value elif request.POST.get('declaration'): ''' Update the declaration ''' try: student.get_dionysos_declaration(request) request.user.get_profile().declaration = student.dionysos_declaration request.user.get_profile().save() notification['success'] = u'Η ανανέωση της δήλωσης ήταν επιτυχής' except (CronosError, LoginError) as error: notification['error'] = error.value elif request.POST.get('grades'): ''' Update the grades ''' try: student.get_dionysos_grades(request) request.user.get_profile().grades = student.dionysos_grades request.user.get_profile().save() notification['success'] = u'Η ανανέωση της βαθμολογίας ήταν επιτυχής' except (CronosError, LoginError) as error: notification['error'] = error.value elif request.POST.get('eclass_lessons'): ''' Update the eclass lessons ''' try: student.get_eclass_lessons(request) notification['success'] = u'Η ανανέωση των μαθημάτων e-class ήταν επιτυχής' except (CronosError, LoginError) as error: notification['error'] = error.value return render_to_response('settings_accounts.html',{ 'notification': notification, 'eclass_credentials_form': eclass_credentials_form, 'webmail_form': webmail_form, 'eclass_lessons_form': eclass_lessons_form, 'declaration_form': declaration_form, 'grades_form': grades_form, }, context_instance = RequestContext(request))