aboutsummaryrefslogtreecommitdiff
path: root/newspipe/models/right_mixin.py
diff options
context:
space:
mode:
Diffstat (limited to 'newspipe/models/right_mixin.py')
-rw-r--r--newspipe/models/right_mixin.py64
1 files changed, 64 insertions, 0 deletions
diff --git a/newspipe/models/right_mixin.py b/newspipe/models/right_mixin.py
new file mode 100644
index 00000000..670beafa
--- /dev/null
+++ b/newspipe/models/right_mixin.py
@@ -0,0 +1,64 @@
+from sqlalchemy.ext.associationproxy import _AssociationList
+
+
+class RightMixin:
+ @staticmethod
+ def _fields_base_write():
+ return set()
+
+ @staticmethod
+ def _fields_base_read():
+ return set(["id"])
+
+ @staticmethod
+ def _fields_api_write():
+ return set([])
+
+ @staticmethod
+ def _fields_api_read():
+ return set(["id"])
+
+ @classmethod
+ def fields_base_write(cls):
+ return cls._fields_base_write()
+
+ @classmethod
+ def fields_base_read(cls):
+ return cls._fields_base_write().union(cls._fields_base_read())
+
+ @classmethod
+ def fields_api_write(cls):
+ return cls.fields_base_write().union(cls._fields_api_write())
+
+ @classmethod
+ def fields_api_read(cls):
+ return cls.fields_base_read().union(cls._fields_api_read())
+
+ def __getitem__(self, key):
+ if not hasattr(self, "__dump__"):
+ self.__dump__ = {}
+ return self.__dump__.get(key)
+
+ def __setitem__(self, key, value):
+ if not hasattr(self, "__dump__"):
+ self.__dump__ = {}
+ self.__dump__[key] = value
+
+ def dump(self, role="admin"):
+ if role == "admin":
+ dico = {
+ k: getattr(self, k)
+ for k in set(self.__table__.columns.keys())
+ .union(self.fields_api_read())
+ .union(self.fields_base_read())
+ }
+ elif role == "api":
+ dico = {k: getattr(self, k) for k in self.fields_api_read()}
+ else:
+ dico = {k: getattr(self, k) for k in self.fields_base_read()}
+ if hasattr(self, "__dump__"):
+ dico.update(self.__dump__)
+ for key, value in dico.items(): # preventing association proxy to die
+ if isinstance(value, _AssociationList):
+ dico[key] = list(value)
+ return dico
bgstack15