def activate_account(req, **kwargs): """ :kwargs: phase (there are two phases, first generate, second activate), code medium ( phone | email) """ if kwargs['phase'] == 'generate': try: activation = Activations.create(user=req.user, code=fresh_pin(6)) message = f"""Here is your activation code from @Africaniz {activation.code}. It will expire in 5 minutes.""" if kwargs['medium'] == 'email': if req.user.email_verified: return {'status': False, 'msg': 'Email Verified.'} else: template = { 'id': 'd-ddcfb895e0904b98bc78828c27d63df2', 'data': { 'code': activation.code } } send_email(req.user.email, message, template) elif kwargs['medium'] == 'phone': if not req.user.phone: return {'status': False, 'msg': 'Null Number.'} if req.user.phone_verified: return {'status': False, 'msg': 'Phone Verified.'} else: pass except Exception as e: return {'status': False, 'msg': 'Try Again.'} return {'status': True, 'msg': 'Pin Sent.'} elif kwargs['phase'] == 'activate': try: activation = Activations.get_or_none(code=kwargs['code']) if activation: now = datetime.datetime.now() tdelta = now - activation.ctime if tdelta.seconds >= 5 * 60: return {'status': False, 'msg': 'Pin Expired.'} if activation.user == req.user: if kwargs['medium'] == 'email': Users.update(email_verified=True).where( Users.id == req.user.id).execute() msg = 'Email' elif kwargs['medium'] == 'phone': Users.update(phone_verified=True).where( Users.id == req.user.id).execute() msg = 'Phone' else: return {'status': False, 'msg': 'Wrong User.'} else: return {'status': False, 'msg': 'Ungenerated Pin.'} except Exception as e: return {'status': False, 'msg': "Server Error."} return {'status': True, 'msg': f'{msg} Activated.'}
def get_user(req, **kwargs): """ :kwargs: id """ try: user = Users.get_or_none(id=int(kwargs['id'])) data = { 'id': user.id, 'email': user.email, 'phone': user.phone, 'name': user.name, 'level': user.level, 'email_verified': user.email_verified, 'phone_verified': user.phone_verified, 'info': user.info, 'is_active': user.is_active, 'products': user.items.select().count(), 'notes': user.notifications.select().where( Notifications.is_read == False).count() } except Exception as e: return {'status': False, 'msg': 'User Missing.'} return {'status': True, 'data': {'user': data}, 'msg': 'User Fetched.'}
def create_user(req, **kwargs): """ :kwargs: email, phone, level, country, city, code, phone_code, mode """ try: info = { 'personal': { 'phone': kwargs['phone'], 'email': kwargs['email'], 'country': kwargs['country'], 'code': kwargs['code'], 'city': kwargs['city'] } } if kwargs['mode'] == 'create': user = Users.create(email=kwargs['email'], phone=kwargs['phone_code'], level=kwargs['level'], info=info) message = f"""Welcome to <strong> @Africaniz</strong>,.Akwaaba. Go to <a href='https://www.africaniz.com/auth/reset'>Africaniz Reset Password.</a>""" template = {'id': 'd-a57c95d98df745008d1caeedcaec18fd', 'data': {}} send_email(kwargs["email"], message, template) elif kwargs['mode'] == 'edit': user = Users.update( email=kwargs['email'], phone=kwargs['phone_code'], level=kwargs['level'], ).where(Users.id == kwargs['id']).execute() user = Users.get_by_id(kwargs['id']) user.info['personal']['city'] = info['personal']['city'] user.info['personal']['code'] = info['personal']['code'] user.info['personal']['country'] = info['personal']['country'] user.info['personal']['email'] = info['personal']['email'] user.info['personal']['phone'] = info['personal']['phone'] user.save() else: return {'status': False, 'msg': 'Command Unknown.'} except Exception as e: return {'status': False, 'msg': 'Exception Raised.'} return {'status': True, 'msg': 'Task Done.'}
def reset_password(req, **kwargs): """ :kwargs: """ """ :kwargs: phase (there are two phases, first generate, second reset), code medium ( phone | email) """ if kwargs['phase'] == 'generate': try: activation = Activations.create(code=fresh_pin(6)) message = f"""Here is your activation code from @Africaniz {activation.code}. It will expire in 5 minutes.""" template = { 'id': 'd-ddcfb895e0904b98bc78828c27d63df2', 'data': { 'code': activation.code } } send_email(kwargs['email'], message, template) except Exception as e: return {'status': False, 'msg': 'Try Again.'} return {'status': True, 'msg': 'Pin Sent.'} elif kwargs['phase'] == 'reset': try: activation = Activations.get_or_none(code=kwargs['code']) if activation: now = datetime.datetime.now() tdelta = now - activation.ctime if tdelta.seconds >= 5 * 60: return {'status': False, 'msg': 'Pin Expired.'} if 'password' in kwargs and kwargs['password'] != "": Users.update(password=bcrypt.hashpw( kwargs["password"].encode(), bcrypt.gensalt())).where( Users.email == kwargs['email']).execute() else: return {'status': False, 'msg': 'Missing Password'} else: return {'status': False, 'msg': 'Ungenerated Pin.'} except Exception as e: return {'status': False, 'msg': "Server Error."} return {'status': True, 'msg': 'Password Reset.'}
def get_users(req, **kwargs): """ :kwargs: None """ try: if 'filter' in kwargs: filt = Users.level == kwargs['filter'] else: filt = Users.level != 'customer' users = Users.select( Users.id, Users.email, Users.phone, Users.level, Users.name, Users.login_count, Users.login_tries, Users.logins_failed, Users.last_login.to_timestamp().alias('last_login')).where( filt).dicts()[:] except Exception as e: return {'status': False, 'msg': 'Exception Raised.'} return {'status': True, 'data': users, 'msg': 'Users Found.'}
def resend_email(req, **kwargs): """ :kwargs: email """ try: user = Users.get_or_none(email=kwargs["email"]) if user: message = f"""Welcome to <strong> @Africaniz</strong>,.Akwaaba. Go to <a href='{req.referer}'>Africaniz Login.</a>""" send_email(kwargs["email"], message) return {"status": True, "msg": 'Email Sent.'} else: return {"status": False, "msg": "Missing User."} except Exception as e: return {"status": False, "msg": "Resend Failed."}
def fetch_item(req, **kwargs): """ Gets a single item :kwargs: item """ item = Items.select().where(Items.id == kwargs['item']).join(Users).get() if not item: return {'status': False, 'msg': 'Item Unavailable.'} user = Users.get_by_id(item.user.id) likes = Likes.select().where(Likes.what == 'item', Likes.pk == item.id).count() data = { 'seller_id': user.id, 'seller_name': user.name, 'seller_info': user.info, 'id': item.id, 'likes': likes, 'item': item.item } return {'status': True, 'data': {item.id: data}}
def register(req, **kwargs): """ :kwargs: email, password """ try: user = Users.create( email=kwargs["email"], password=bcrypt.hashpw(kwargs["password"].encode(), bcrypt.gensalt()), ) message = f"""Welcome to <strong> @Africaniz</strong>,.Akwaaba. Go to <a href='https://www.africaniz.com/auth/login'>Africaniz Login.</a>""" template = {'id': 'd64d339f-5146-48ea-bdae-35244673c420', 'data': {}} send_email(kwargs["email"], message, template) except Exception as e: return {"status": False, "msg": "Email Exists."} return {"status": True, "msg": "Registration Successfull."}
def upload_item(req, **kwargs): """ Upload new product. :kwargs: item_details, seller_id, update ( whether it is an update) """ item = kwargs['item_details'] item['images'] = upload_images(item['images'], item['tags']) try: for i in range(len(item['options'])): for j in range(len(item['options'][i]['values'])): item['options'][i]['values'][j]['images'] = upload_images( item['options'][i]['values'][j]['images'], item['tags']) except Exception as e: return {'status': False, 'msg': 'Images Upload Failed.'} try: seller = Users.get_by_id(int(kwargs['seller_id'])) if 'update' in kwargs: item = Items.update(item=item).where( Items.id == int(kwargs['id'])).execute() item = Items.get_by_id(int(kwargs['id'])) else: item = Items.create(user=seller, item=item) add_tags(item, item.item['tags']) #upload to sccial media except Exception as e: return {'status': False, 'msg': 'Upload Failed.'} return { 'status': True, 'data': { 'item_id': item.id }, 'msg': 'Upload Successfull.' }
def set_info(req, **kwargs): """ Set information of user :kwargs: info, data """ try: old_info = req.user.info if kwargs['info'] in ['personal', 'social']: old_info[kwargs['info']] = kwargs['data'] Users.update(info=old_info).where( Users.id == req.user.id).execute() elif kwargs['info'] == 'profile': data = kwargs['data'] data['brand'] = upload_images(data['brand'], [data['title']]) data['logo'] = upload_images(data['logo'], [data['title']]) old_info[kwargs['info']] = data Users.update(info=old_info).where( Users.id == req.user.id).execute() elif kwargs['info'] == 'account': if req.user.name != kwargs['data']['name']: if Users.select().where( Users.name == kwargs['data']['name']).exists(): return {'status': False, 'msg': 'Username Exists.'} Users.update(name=kwargs['data']['name']).where( Users.id == req.user.id).execute() if req.user.email != kwargs['data']['email']: if Users.select().where( Users.email == kwargs['data']['email']).exists(): return {'status': False, 'msg': 'Email Exists.'} Users.update(email=kwargs['data']['email'], email_verified=False).where( Users.id == req.user.id).execute() if req.user.phone != kwargs['data']['phone']: if Users.select().where( Users.phone == kwargs['data']['phone']).exists(): return {'status': False, 'msg': 'Phone Exists.'} Users.update(phone=kwargs['data']['phone'], phone_verified=False).where( Users.id == req.user.id).execute() else: return {'status': False, 'msg': 'Dunno what to do.'} except Exception as e: return {'status': False, 'msg': 'SetInfo Failed.'} return {'status': True, 'msg': 'Info Updated.'}
def login(req, **kwargs): """ :kwargs: email, password, device_hash, device_data """ try: user = Users.get_or_none(email=kwargs["email"]) if user: if user.login_tries + 1 > 10: return { "status": False, "msg": "Your account has been blocked, you need to reset your password." } Users.update(login_tries=Users.login_tries + 1).where(Users.id == user.id).execute() if bcrypt.checkpw(kwargs["password"].encode(), user.password.encode()): token = gen_token(user.email, fresh_pin()) Logins.create( user=user, device_hash=kwargs["device_hash"], device_data=kwargs["device_data"], token=token, ) user_data = { 'id': user.id, 'email': user.email, 'phone': user.phone, 'name': user.name, 'level': user.level, 'email_verified': user.email_verified, 'phone_verified': user.phone_verified, 'info': user.info, 'is_active': user.is_active, } Users.update( login_count=Users.login_count + 1, last_login=datetime.datetime.now(), login_tries=0).where(Users.id == user.id).execute() return { "status": True, "data": { "token": token, "user": user_data }, "msg": "Login Successfull." } else: return {"status": False, "msg": "Wrong Password."} else: return {"status": False, "msg": "Missing User."} except Exception as e: return {"status": False, "msg": "Login Failed."}