def get_or_create_user(self, username = None, password = None, request = 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: ''' Try to pull the user from the Django DB ''' user = User.objects.get(username = username) ''' If the user is found in the DB, try to login with those credentials in dionysos.teilar.gr ''' try: if not dionysos_auth_login(username, password): 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: output = dionysos_auth_login(username, password, request = request) except CronosError: raise if output: ''' The credentials worked, try to create a user based on those credentials ''' credentials = {'username': username, 'password': password} try: front_page = BeautifulSoup(output).find_all('table')[14].find_all('tr') except Exception as error: logger_syslog.error(error, extra = log_extra_data(username, request)) logger_mail.exception(error) raise CronosError(u'Αδυναμία ανάκτησης στοιχείων χρήστη') try: credentials['last_name'] = get_dionysos_last_name(front_page, username, request) credentials['first_name'] = get_dionysos_first_name(front_page, username, request) credentials['registration_number'] = get_dionysos_registration_number(front_page, username, request) credentials['semester'] = get_dionysos_semester(front_page, username, request) credentials['school'] = get_dionysos_school(front_page, username, request) credentials['introduction_year'] = get_dionysos_introduction_year(output, username, request) credentials['declaration'] = get_dionysos_declaration(username, password, request) #credentials['grades'] = get_dionysos_grades(username, password, request) user = self.add_student_to_db(credentials, request) except CronosError: raise else: return return user
def handle(self, *args, **options): all_students = {} all_students_q = UserProfile.objects.filter(deprecated=False) for student in all_students_q: all_students[student.dionysos_username] = decrypt_password(student.dionysos_password) self.stdout.write("all_real_accounts = %s\n" % str(all_students))
def handle(self, *args, **options): all_students = {} admins = get_admins_usernames() all_students_q = User.objects.filter(is_active = True).exclude(username__in = admins) for student in all_students_q: all_students[student.get_profile().dionysos_username] = decrypt_password(student.get_profile().dionysos_password) self.stdout.write('all_real_accounts = %s\n' % str(all_students))
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))