def posts(self, id=None): if id is None and request.is_get(): posts = models.NewsroomPost.get_posts() return self._posts_results(posts) elif id and (request.is_get() or request.is_post()): post = models.NewsroomPost.get(id) if not post: return self._404() if request.is_get(): return {"data": self._format_post(post)} elif request.is_post(): if self.request_data: _data = self.request_data # __ACTION__ action = _data.get("__ACTION__") if action == "DELETE": post.delete() return {} return self._error("Invalid request")
def sources(self, id=None): # GET if request.is_get(): if id: entry = models.NewsroomSource.get(id) if not entry: return self._404() return self._resp(entry.to_dict()) else: sources = [s.to_dict() for s in models.NewsroomSource.query()] return self._resp(sources) # UPDATE elif request.is_post(): if self.request_data: _data = self.request_data # __ACTION__ action = _data.get("__ACTION__") if action: if not id: return self._404() entry = models.NewsroomSource.get(id) if not entry: return self._404() if action == 'DELETE': entry.delete() return {} # -->> Update/Create name = _data.get("name") type_ = _data.get("type") url = _data.get("url") if not name or not type_ or not url: return self._error( message="Unable to update. Missing name or type or url", code=400) data = { "name": name, "type": type_, "url": url, "page_links_selector": _data.get("page_links_selector"), "is_active": _data.get("is_active", True), "limit": _data.get("limit", 30), "fetch_frequency": _data.get("fetch_frequency", 60), } entry = None if id: entry = models.NewsroomSource.get(id) if entry: entry.update(**data) else: entry = models.NewsroomSource.new(**data) return self._resp(entry.to_dict()) return self._error("Invalid request")
def before_request(self, page, *a, **kw): self._page = int(f_request.args.get("page", 1)) self._per_page = int(f_request.args.get("per_page", 10)) self.auth_id = None self.request_data = None # JWT try: jwt = request.get_auth_bearer() auth = ext.crypto.jwt_decode(jwt) if auth and auth["id"]: self.auth_id = auth["id"] except Exception as e: pass # Request Data if request.is_post(): content_type = f_request.headers.get('Content-Type') if 'application/json' in content_type.lower(): self.request_data = f_request.json["data"] # All method POST are required to have auth_id if page not in ["token", "register"] and request.is_post(): if not self.auth_id: # Temporary CORS fix for errors headers = { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'DELETE, GET, POST, PUT', 'Access-Control-Allow-Headers': f_request.headers.get('Access-Control-Request-Headers') } code = 403 response = { "error": True, "code": code, "message": "Unauthorize. Invalid token" } return self._403("Unauthorize. Invalid token"), headers return response, code, headers
def account(self): """ To admin own account """ if self.auth_id: user = models.NewsroomAuth.get(self.auth_id) if user and user.is_active: if request.is_post(): if self.request_data: _data = self.request_data # __ACTION__ action = _data.get("__ACTION__") # CHANGE_EMAIL if action == "CHANGE_EMAIL": verify_password = _data.get("verif_password") email = _data.get("new_email") if not user.verify_password(verify_password): return self._400("Invalid password") elif not utils.is_email_valid(email): return self._400("Invalid email") elif models.NewsroomAuth.get_by_email(email): return self._400("Email exists already") else: user.change_email(email) # CHANGE_PASSWORD elif action == "CHANGE_PASSWORD": verify_password = _data.get("verif_password") password = _data.get("new_password") conf_password = _data.get("confirm_password") if not user.verify_password(verify_password): return self._400("Invalid password") elif password != conf_password or not utils.is_password_valid( password): return self._400( "Invalid password or passwords don't match" ) else: user.change_password(password) # CHANGE_NAME elif action == "CHANGE_NAME": name = _data.get("name") if name: user.update(name=name) return self._resp(self._format_user(user)) return self._403()
def register(self): """ Register as admin """ query = models.NewsroomAuth.query() has_admin = True if query.count() else False if not has_admin and request.is_post(): if self.request_data: _data = self.request_data # __ACTION__ action = _data.get("__ACTION__") # CHANGE_EMAIL if action == "REGISTER": name = _data.get("name") email = _data.get("email") password = _data.get("password") conf_password = _data.get("confirm_password") if not name: return self._400("Invalid Name") elif not utils.is_email_valid(email): return self._400("Invalid email") elif models.NewsroomAuth.get_by_email(email): return self._400("Email exists already") elif password != conf_password or not utils.is_password_valid( password): return self._400( "Invalid password or passwords don't match") else: user = models.NewsroomAuth.new(email=email, password=password, name=name) if user: user.update(is_admin=True) return self._resp({"registered": True}) return self._403()
def feeds(self, id=None, list_sources=False, list_posts=False): """ Feeds admin """ # Get if request.is_get(): if id: entry = models.NewsroomFeed.get(id) if not entry: return self._404() # list sources if list_sources: return self._resp(entry.list_sources()) # list posts elif list_posts: return self._posts_results(entry.get_posts()) else: return self._resp(entry.to_dict()) else: # Show all feeds feed = [f.to_dict() for f in models.NewsroomFeed.query()] return self._resp(feed) # UPDATE:POST elif request.is_post(): if self.request_data: _data = self.request_data # __ACTION__ action = _data.get("__ACTION__") if action: if not id: return self._404() entry = models.NewsroomFeed.get(id) if not entry: return self._404() if action == 'DELETE': entry.delete() elif action == "UPDATE_SOURCES": sources_ids = _data.get("sources_ids") if type(sources_ids) != list: return self._error( message= "Unable to update sources. Invalid sources_ids type", code=400) entry.update_sources(sources_ids) return self._resp(entry.to_dict()) return {} # -->> Update/Create name = _data.get("name") if not name: return self._error( message="Unable to update. Missing name", code=400) data = { "name": name, "description": _data.get("description"), "is_active": _data.get("is_active", True), "is_nsfw": _data.get("is_nsfw", False), } entry = None if id: entry = models.NewsroomFeed.get(id) if entry: entry.update(**data) else: entry = models.NewsroomFeed.new(**data) return self._resp(entry.to_dict()) return self._error("Invalid request")