def update_email(self): data = request_json() schema = { 'email': rules['email'], } v = make_validator(schema) if not v.validate(data): return failed('Invalid input', {'error': v.errors}) current_user.email = data['email'] current_user.email_confirmed = False current_user.save() return success()
def register(self): data = request_json() # recaptcha errorMsg = validate_recaptcha(data['recaptcha']) if errorMsg: return failed(errorMsg) # schema = { 'email': rules['email'], 'first_name': { 'required': True, 'type': 'string', 'maxlength': 255 }, 'last_name': { 'required': True, 'type': 'string', 'maxlength': 255 }, 'password': rules['password'], 'user_type': { 'required': True, 'type': 'string', 'allowed': ['school', 'student'] }, } v = make_validator(schema) if not v.validate(data): return failed('Invalid input', {'error': v.errors}) if data.get('user_type') != 'student': return failed('Invalid user_type') user = self.model.objects.filter(email=data['email']).first() if user: return failed('An account with this email already exists') data['password'] = hash_pwd(data['password']) try: user = store(self.model, data) profileData = dict_pluck(data, ['first_name', 'last_name']) profileData['user_id'] = user.id profile = store(models.student_profile, profileData) self.do_send_confirmation_email(user.email, user.id) except Exception as e: print(e) errorMsg = str(e) if errorMsg: return failed(errorMsg) login_user(user) return success()
def send_reset_password_email(self): data = request_json() # recaptcha errorMsg = validate_recaptcha(data['recaptcha']) if errorMsg: return failed(errorMsg) # validate schema = { 'email': rules['email'], } v = make_validator(schema) if not v.validate(data): return failed('Invalid input', {'error': v.errors}) # whether exist email = data['email'] user = self.model.objects.filter(email=email).first() if not user: return failed('The account for the given email does not exist') if user.user_type == 'school' and get_user_profile( user).status != 'normal': return failed('This account is currently not enabled') # data = { 'token': md5(str_rand(16)), 'email': email, } record = models.reset_password_email.objects.filter( email=email).first() if record: item = update(models.reset_password_email, data, record.id) else: item = store(models.reset_password_email, data) link = url_for('index', _external=True) + 'reset-password?token=' + data[ 'token'] # generate absolute link print('reset password link:', link) try: msg = Message('[%s] Reset your account password' % (app.config['site_name']), recipients=[email]) msg.html = render_template('email/reset-password.html', email=email, link=link, app=app) mail.send(msg) except Exception as e: return failed(str(e)) return success()
def reset_password(self): data = request_json() # recaptcha errorMsg = validate_recaptcha(data['recaptcha']) if errorMsg: return failed(errorMsg) # validate schema = { 'user_id': { 'required': True, 'type': 'string' }, 'token': { 'required': True, 'type': 'string' }, 'password': rules['password'], } v = make_validator(schema) if not v.validate(data): return failed('Invalid input', {'error': v.errors}) # record = models.reset_password_email.objects.filter( token=data['token']).first() user = self.model.objects.filter(id=data['user_id']).first() if not record or not user or record.email != user.email: return failed('Illegal request') # expired = (datetime.now() - record.updated_at).seconds > 3600 * 1 if expired: return failed('Link expired') user.password = hash_pwd(data['password']) user.email_confirmed = True user.save() record.delete() return success()
def beforeWrite(self, data, type): self.data = data # if current_user.user_type != 'school': return ut.failed('Only schools can create courses') # data['school_id'] = current_user.id # validate schema = { # 'with_accom': { 'required': True, 'type': 'boolean' }, # 'start_date': { 'required': True, 'type': 'number' }, 'end_date': { 'required': True, 'type': 'number' }, 'category_id': { 'required': True, 'type': 'string', 'maxlength': 255 }, 'level': { 'required': True, 'type': 'string', 'maxlength': 255 }, 'title': { 'required': True, 'type': 'string', 'maxlength': 255 }, # 'gender': { 'required': True, 'type': 'string', 'maxlength': 255 }, 'age_range': { 'required': True, 'type': 'list' }, 'hours': { 'required': True, 'type': 'list' }, 'description': { 'required': True, 'type': 'string', 'maxlength': 10000 }, # 'language': { 'required': True, 'type': 'string', 'maxlength': 255 }, # 'street': { 'required': True, 'type': 'string', 'maxlength': 255 }, 'city': { 'required': True, 'type': 'string', 'maxlength': 255 }, 'province': { 'required': True, 'type': 'string', 'maxlength': 255 }, 'zip_code': { 'required': True, 'type': 'string', 'maxlength': 255 }, 'country': { 'required': True, 'type': 'string', 'maxlength': 255 }, 'api_key': { 'required': True, 'type': 'string', 'maxlength': 255 }, 'location_description': { 'required': True, 'type': 'string', 'maxlength': 10000 }, 'how_to_get_there': { 'required': True, 'type': 'string', 'maxlength': 10000 }, 'where_to_meet': { 'required': True, 'type': 'string', 'maxlength': 10000 }, # 'schedule': { 'required': True, 'type': 'string', 'maxlength': 10000 }, 'meals_included': { 'required': True, 'type': 'boolean' }, 'meals': { 'required': True, 'type': 'list' }, # 'issue_certificate': { 'required': True, 'type': 'boolean' }, # 'request_form_enabled': { 'required': True, 'type': 'boolean' }, # # 'group_size': { 'required': True, 'type': 'number' }, 'seat_quota': { 'required': True, 'type': 'number' }, 'price': { 'required': True, 'type': 'number' }, # # 'cover': { 'required': True, 'type': 'string', 'maxlength': 255 }, 'photos': { 'required': True, 'type': 'list', 'minlength': 2 }, } v = ut.make_validator(schema) if not v.validate(data): return ut.failed('Invalid input', {'error': v.errors}) # validate instructors meals certificate request_form price early_bird down_payment t = data['instructors'] if not ut.keys_match(t, ["name", "phone", "description", "photo"]): return ut.failed('Invalid input') k = ut.dict_any_key_none(t[0]) if k: return ut.failed('The %s of main instructor is required.' % (k.replace('_', ' '))) if data['meals_included']: if len(data['meals']) == 0: return ut.failed('The meals is required.') if data['issue_certificate']: if not data['certificate']: return ut.failed('The certificate is required.') if data['request_form_enabled']: if data['request_form'][0][ 'enabled'] and not data['request_form'][0]['value']: return ut.failed('Request form 1 is required.') if data['request_form'][1][ 'enabled'] and not data['request_form'][1]['value']: return ut.failed('Request form 2 is required.') if not data['with_accom']: if data['price'] == None: return ut.failed('The price is required.') if data['early_bird']['enabled']: k = ut.dict_any_key_none(data['early_bird']) if k: return ut.failed('The %s of early bird is required.' % (k.replace('_', ' '))) if data['down_payment']['enabled']: k = ut.dict_any_key_none(data['down_payment']) if k: return ut.failed('The %s of down payment is required.' % (k.replace('_', ' '))) # accomodation if data['with_accom']: schema = { 'type': { 'required': True, 'type': 'string' }, 'name': { 'required': True, 'type': 'string' }, 'phone': { 'required': True, 'type': 'string' }, 'address': { 'required': True, 'type': 'string' }, 'facilities': { 'required': True, 'type': 'list' }, 'description': { 'required': True, 'type': 'string', 'maxlength': 10000 }, 'photos': { 'required': True, 'type': 'list' }, } v = ut.make_validator(schema) if not v.validate(data['accomodation']): return ut.failed('Invalid input for accomodation', {'error': v.errors}) roomCount = 0 for i, v in enumerate(data['accomodation']['rooms']): if v['enabled']: roomCount += 1 k = ut.dict_any_key_none(v) if k: return ut.failed('The %s of room %s is required.' % (k.replace('_', ' '), i + 1)) if roomCount == 0: return ut.failed('At least one enabled room is needed')
def profile(self): data = (request_json() or {}).get('data') if not data: # get return success(to_dict(get_user_profile(current_user))) else: # update if current_user.user_type == 'student': # validate schema = { 'avatar': { 'required': True, 'type': 'string', 'maxlength': 255 }, 'first_name': { 'required': True, 'type': 'string', 'maxlength': 255 }, 'last_name': { 'required': True, 'type': 'string', 'maxlength': 255 }, 'gender': rules['gender'], 'birthday': { 'required': True, 'type': 'number' }, 'nationality': { 'required': True, 'type': 'string', 'maxlength': 255 }, 'country_of_residence': { 'required': True, 'type': 'string', 'maxlength': 255 }, 'email': rules['email'], 'phone': { 'required': True, 'type': 'string', 'maxlength': 255 }, 'passport_info': { 'required': True, 'maxlength': 1000 }, 'emergency_contact_persons': { 'required': True, 'maxlength': 1000 }, } v = make_validator(schema) if not v.validate(data): return failed('Invalid input', {'error': v.errors}) try: t = data['passport_info'] if not keys_match( t, ['number', 'issued_country', 'expiry_date']): return failed('Invalid input') for k, v in t.items(): if not v: return failed('The %s is required.' % (k.replace('_', ' '))) t = data['emergency_contact_persons'] keys = ['name', 'relationship', 'tel'] if not keys_match(t[0], keys) or not keys_match( t[1], keys): return failed('Invalid input') for k, v in t[0].items(): if not v: return failed('The %s is required.' % (k.replace('_', ' '))) except Exception as e: print(e) return failed('Invalid input') # todo validate school profile # model = models.student_profile if current_user.user_type == 'student' else models.school_profile profile = get_user_profile(current_user) if current_user.email != data['email']: current_user.email = data['email'] current_user.email_confirmed = False current_user.save() update(model, data, profile.id) return success()
def register(self): data = request_json() # recaptcha errorMsg = validate_recaptcha(data['recaptcha']) if errorMsg: return failed(errorMsg) # schema = { 'name': { 'required': True, 'type': 'string', 'maxlength': 255 }, 'address': { 'required': True, 'type': 'string', 'maxlength': 255 }, 'city': { 'required': True, 'type': 'string', 'maxlength': 255 }, 'country': { 'required': True, 'type': 'string', 'maxlength': 255 }, 'email': rules['email'], 'introduction': { 'required': True, 'type': 'string', 'maxlength': 1000 }, 'website': { 'required': True, 'type': 'string', 'maxlength': 1000 }, 'contact_persons': { 'required': True, 'maxlength': 1000 }, 'registration_document': { 'required': True, 'maxlength': 1000 }, } v = make_validator(schema) if not v.validate(data): return failed('Invalid input', {'error': v.errors}) try: t = data['contact_persons'] keys = ['last_name', 'first_name', 'title', 'email', 'tel'] if not keys_match(t[0], keys) or not keys_match(t[1], keys): return failed('Invalid input') for k, v in t[0].items(): if not v: return failed('The %s is required.' % (k.replace('_', ' '))) except Exception as e: app.logger.debug(e) return failed('Invalid input') # user = self.model.objects.filter(email=data['email']).first() if user: return failed('An account with this email already exists') userData = { 'email': data['email'], 'password': hash_pwd(str_rand(16)), 'user_type': 'school', } try: user = store(self.model, userData) data['user_id'] = user.id data['status'] = 'pending' profile = store(models.school_profile, data) except Exception as e: app.logger.debug(e) return failed(str(e)) return success()