Browse Source

- resolve imports problem

fanch 1 year ago
parent
commit
f91def1af2

+ 0 - 0
src/djangotools/views/utils.py → src/djangotools/common/loggin.py


+ 0 - 0
src/djangotools/common/preferences/__init__.py


+ 0 - 0
src/djangotools/common/preferences/base.py


+ 8 - 4
src/djangotools/common/route.py

@@ -1,14 +1,15 @@
 import traceback
 import traceback
 
 
+from django.conf import settings
 from django.contrib.auth.models import User
 from django.contrib.auth.models import User
 from django.db.models import Manager, Model, QuerySet
 from django.db.models import Manager, Model, QuerySet
 from django.db.models.base import ModelBase
 from django.db.models.base import ModelBase
+from django.shortcuts import redirect
 
 
 from djangotools.common import response, BaseSerializationModel
 from djangotools.common import response, BaseSerializationModel
 from djangotools.common.errors import CustomException
 from djangotools.common.errors import CustomException
 from djangotools.common.path import PointPath, ModelPath, AttributePath, ConstPath
 from djangotools.common.path import PointPath, ModelPath, AttributePath, ConstPath
-
-from djangotools.views.utils import debug_login
+from djangotools.common.loggin import debug_login
 
 
 
 
 class Route:
 class Route:
@@ -76,8 +77,11 @@ class RegisteredRoute:
         debug_login(req, self._default_user_id_)
         debug_login(req, self._default_user_id_)
         user = req.user
         user = req.user
         if self.options.get("need_auth", False) and  not user.is_authenticated:
         if self.options.get("need_auth", False) and  not user.is_authenticated:
-            return response.serv_json_not_logged()
-
+            if self.options.get("redirect_login", False):
+                return response.serv_json_not_logged()
+            else:
+                url = settings.LOGIN_URL if settings.LOGIN_URL.startswith("/") else "/"+settings.LOGIN_URL
+                return redirect(url)
 
 
         for part in self.route.path.iter_models():
         for part in self.route.path.iter_models():
             if obj is None:
             if obj is None:

+ 26 - 6
src/djangotools/models/preference.py

@@ -1,4 +1,5 @@
 import json
 import json
+from collections import OrderedDict
 
 
 from django.contrib.auth.models import User
 from django.contrib.auth.models import User
 from django.db import models
 from django.db import models
@@ -8,9 +9,22 @@ from djangotools.models import UserIdManager
 
 
 from djangotools.common.auto_path import AutoPath
 from djangotools.common.auto_path import AutoPath
 
 
-
-class UserPreferenceManager:
-
+class Pref:
+    def __init__(self, name, default):
+        self.name = name
+        self.default = default
+
+class UserPreferenceManagerMeta(type):
+    def __new__(cls, *args, **kwargs):
+        obj = super().__new__(cls, *args, **kwargs)
+        if isinstance(obj.preferences, (list, tuple)):
+            obj.preferences_dict = OrderedDict([(x.name, x) for x in obj.preferences])
+        elif isinstance(obj.preferences, dict):
+            obj.preferences_dict = OrderedDict([(k, Pref(k, v)) for k, v in obj.preferences.items()])
+        return obj
+
+class UserPreferenceManager(metaclass=UserPreferenceManagerMeta):
+    preferences = []
     def __init__(self, user, profile="default"):
     def __init__(self, user, profile="default"):
         self.user=user
         self.user=user
         self.profile=profile
         self.profile=profile
@@ -23,18 +37,21 @@ class UserPreferenceManager:
         pref = self._get(key)
         pref = self._get(key)
         if pref:
         if pref:
             pref.set(value)
             pref.set(value)
-            return pref
-        return Preference.objects.create(
+            return value
+        Preference.objects.create(
                 user=self.user,
                 user=self.user,
                 profile=self.profile,
                 profile=self.profile,
                 key=key,
                 key=key,
                 value = json.dumps(value)
                 value = json.dumps(value)
             )
             )
+        return value
 
 
     def get(self, key, default=None):
     def get(self, key, default=None):
         pref = self._get(key)
         pref = self._get(key)
         if pref is not None:
         if pref is not None:
             return pref.get()
             return pref.get()
+        if key in self.preferences_dict:
+            return self.set(key, self.preferences_dict[key].default)
         return self.set(key, default)
         return self.set(key, default)
 
 
 
 
@@ -44,7 +61,6 @@ class UserPreferenceManager:
         except Preference.DoesNotExist:
         except Preference.DoesNotExist:
             return None
             return None
 
 
-
     @property
     @property
     def dict(self):
     def dict(self):
         if not self.user.is_authenticated:
         if not self.user.is_authenticated:
@@ -53,6 +69,10 @@ class UserPreferenceManager:
             x.key : x.get() for x in Preference.objects.filter(user=self.user, profile=self.profile)
             x.key : x.get() for x in Preference.objects.filter(user=self.user, profile=self.profile)
         }
         }
 
 
+
+
+
+
 class Preference(models.Model, SerializableModel, AutoPath):
 class Preference(models.Model, SerializableModel, AutoPath):
     _path_ = None
     _path_ = None
 
 

+ 15 - 5
src/djangotools/views/context/base.py

@@ -1,4 +1,5 @@
 from django.conf import settings
 from django.conf import settings
+from django.shortcuts import redirect
 
 
 from djangotools.common.errors import UnauthorizedException
 from djangotools.common.errors import UnauthorizedException
 import datetime
 import datetime
@@ -34,8 +35,10 @@ class ContextData:
     need_auth = True
     need_auth = True
     redirect = True
     redirect = True
     action_params = True
     action_params = True
-
+    preferences_class = None
     default_action = None
     default_action = None
+    context_to_string = True
+    redirect_login = False
 
 
     def is_mobile(self, request):
     def is_mobile(self, request):
         ua = request.headers.get("user-agent", "").lower()
         ua = request.headers.get("user-agent", "").lower()
@@ -46,8 +49,14 @@ class ContextData:
     def get_context(self, request,  **kwargs):
     def get_context(self, request,  **kwargs):
 
 
         from djangotools.models.preference import UserPreferenceManager
         from djangotools.models.preference import UserPreferenceManager
+        self.preferences_class = self.preferences_class or UserPreferenceManager
+        request.user.pref = self.preferences_class(request.user)
+
         if ( not allow_all and self.need_auth) and not request.user.is_authenticated:
         if ( not allow_all and self.need_auth) and not request.user.is_authenticated:
-            raise UnauthorizedException("Cette ressource nécessite une authentification")
+            if self.redirect_login:
+                return redirect(settings.LOGIN_URL)
+            else:
+                raise UnauthorizedException("Cette ressource nécessite une authentification")
 
 
         body = request.POST or (json.loads(request.body) if  request.body else None)
         body = request.POST or (json.loads(request.body) if  request.body else None)
         if "post_action" in kwargs:
         if "post_action" in kwargs:
@@ -65,16 +74,17 @@ class ContextData:
         else:
         else:
             data = {}
             data = {}
         if "data" in kwargs: data.update(kwargs.pop("data"))
         if "data" in kwargs: data.update(kwargs.pop("data"))
-        pref = UserPreferenceManager(request.user)
+
         return {
         return {
             "context" : {
             "context" : {
                 "page" : self.page,
                 "page" : self.page,
                 "data" : data,
                 "data" : data,
                 "user" : {
                 "user" : {
+                    "authenticated" : request.user.is_authenticated,
                     "name" : request.user.username,
                     "name" : request.user.username,
                     "id" : request.user.id,
                     "id" : request.user.id,
-                    "preferences" : pref.dict,
-                    "profile" : pref.profile,
+                    "preferences" : request.user.pref.dict,
+                    "profile" : request.user.pref.profile,
                     "device": {
                     "device": {
                         "mobile" : self.is_mobile(request)
                         "mobile" : self.is_mobile(request)
                     }
                     }

+ 7 - 7
src/djangotools/views/misc.py

@@ -11,7 +11,7 @@ from djangotools.common import response
 from djangotools.common.errors import CustomException, UnauthorizedException
 from djangotools.common.errors import CustomException, UnauthorizedException
 from djangotools.views.context.base import get_context_class
 from djangotools.views.context.base import get_context_class
 from djangotools.views.router import Router
 from djangotools.views.router import Router
-from djangotools.views.utils import debug_login
+from djangotools.common.loggin import debug_login
 
 
 
 
 def context(page, data, **kwargs):
 def context(page, data, **kwargs):
@@ -25,7 +25,7 @@ def context(page, data, **kwargs):
 
 
 
 
 
 
-@Router.post(settings.CONTEXT_URL)
+@Router.post(settings.CONTEXT_URL, )
 def raw_context(request, name):
 def raw_context(request, name):
     debug_login(request)
     debug_login(request)
     context_class = get_context_class(name)
     context_class = get_context_class(name)
@@ -53,7 +53,7 @@ def _render(request, name, page=settings.ROOT_TEMPLATE, *args, **kwargs):
         context = context_class()
         context = context_class()
         try:
         try:
             data = context.get_context(request, *args, **kwargs)
             data = context.get_context(request, *args, **kwargs)
-            if kwargs.get("context_to_string", True):
+            if kwargs.get("context_to_string", context.context_to_string):
                 data["context"] = json.dumps(data["context"])
                 data["context"] = json.dumps(data["context"])
             print("context", context.need_auth, data)
             print("context", context.need_auth, data)
         except UnauthorizedException as err:
         except UnauthorizedException as err:
@@ -68,17 +68,17 @@ def render_page(name, page=settings.ROOT_TEMPLATE, **opt):
     return lambda request, *args, name=name, page=page, opt=opt, **kwargs: _render(request, name, page=page, *args, **opt, **kwargs)
     return lambda request, *args, name=name, page=page, opt=opt, **kwargs: _render(request, name, page=page, *args, **opt, **kwargs)
 
 
 @Router.get(settings.LOGOUT_URL, need_auth=True)
 @Router.get(settings.LOGOUT_URL, need_auth=True)
-def disconnect(request, user):
-    redirect = request.GET.get("redirect", settings.LOGIN_URL, need_auth=False)
+def disconnect(request):
+    redirect = request.GET.get("redirect", settings.LOGIN_URL)
     logout(request)
     logout(request)
     return HttpResponseRedirect(redirect)
     return HttpResponseRedirect(redirect)
 
 
 
 
-Router.get(settings.LOGIN_URL)(render_page(settings.LOGIN_CONTEXT, settings.LOGIN_TEMPLATE))
+Router.get(settings.LOGIN_URL, need_auth=False, redirect_login=True)(render_page(settings.LOGIN_CONTEXT, settings.LOGIN_TEMPLATE))
 
 
 
 
 
 
-@Router.get(settings.AUTH_URL)
+@Router.post(settings.AUTH_URL, need_auth=False)
 def auth(request):
 def auth(request):
     params = request.POST
     params = request.POST
     redirect = request.GET.get("redirect", "/")
     redirect = request.GET.get("redirect", "/")