Browse Source

Some interface and type fixes

Getty Ritter 4 years ago
parent
commit
b3a2a21069
3 changed files with 20 additions and 7 deletions
  1. 1 1
      lc/app.py
  2. 1 1
      lc/model.py
  3. 18 5
      lc/request.py

+ 1 - 1
lc/app.py

@@ -62,7 +62,7 @@ class Logout(Endpoint):
 @endpoint("/u")
 class CreateUser(Endpoint):
     def api_post(self):
-        u = m.User.from_request(r.User.from_json(flask.request.data))
+        u = m.User.from_request(self.request_data(r.User))
         return flask.redirect(u.base_url())
 
 

+ 1 - 1
lc/model.py

@@ -68,7 +68,7 @@ class User(Model):
         u = User.by_slug(user.name)
         if not u.authenticate(user.password):
             raise e.BadPassword(name=user.name)
-        return u, c.SERIALIZER.dumps({"name": user.name, "password": user.password,})
+        return u, user.to_token()
 
     @staticmethod
     def by_slug(slug: str) -> "User":

+ 18 - 5
lc/request.py

@@ -1,23 +1,36 @@
+import abc
 from dataclasses import dataclass
 from dataclasses_json import dataclass_json
 from datetime import datetime
-from typing import List, Optional
+from typing import List, Mapping, Optional
+
+import lc.config as c
+
+
+class Request(metaclass=abc.ABCMeta):
+    @classmethod
+    @abc.abstractmethod
+    def from_form(cls, form: Mapping[str, str]):
+        pass
 
 
 @dataclass_json
 @dataclass
-class User:
+class User(Request):
     name: str
     password: str
 
     @classmethod
-    def from_form(cls, form):
+    def from_form(cls, form: Mapping[str, str]):
         return cls(name=form["username"], password=form["password"],)
 
+    def to_token(self) -> str:
+        return c.SERIALIZER.dumps({"name": self.name, "password": self.password,})
+
 
 @dataclass_json
 @dataclass
-class Link:
+class Link(Request):
     url: str
     name: str
     description: str
@@ -26,7 +39,7 @@ class Link:
     created: Optional[datetime] = None
 
     @classmethod
-    def from_form(cls, form):
+    def from_form(cls, form: Mapping[str, str]):
         return cls(
             url=form["url"],
             name=form["name"],