Bläddra i källkod

- resolve imports problem

fanch 1 år sedan
förälder
incheckning
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
 
+from django.conf import settings
 from django.contrib.auth.models import User
 from django.db.models import Manager, Model, QuerySet
 from django.db.models.base import ModelBase
+from django.shortcuts import redirect
 
 from djangotools.common import response, BaseSerializationModel
 from djangotools.common.errors import CustomException
 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:
@@ -76,8 +77,11 @@ class RegisteredRoute:
         debug_login(req, self._default_user_id_)
         user = req.user
         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():
             if obj is None:

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

@@ -1,4 +1,5 @@
 import json
+from collections import OrderedDict
 
 from django.contrib.auth.models import User
 from django.db import models
@@ -8,9 +9,22 @@ from djangotools.models import UserIdManager
 
 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"):
         self.user=user
         self.profile=profile
@@ -23,18 +37,21 @@ class UserPreferenceManager:
         pref = self._get(key)
         if pref:
             pref.set(value)
-            return pref
-        return Preference.objects.create(
+            return value
+        Preference.objects.create(
                 user=self.user,
                 profile=self.profile,
                 key=key,
                 value = json.dumps(value)
             )
+        return value
 
     def get(self, key, default=None):
         pref = self._get(key)
         if pref is not None:
             return pref.get()
+        if key in self.preferences_dict:
+            return self.set(key, self.preferences_dict[key].default)
         return self.set(key, default)
 
 
@@ -44,7 +61,6 @@ class UserPreferenceManager:
         except Preference.DoesNotExist:
             return None
 
-
     @property
     def dict(self):
         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)
         }
 
+
+
+
+
 class Preference(models.Model, SerializableModel, AutoPath):
     _path_ = None
 

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

@@ -1,4 +1,5 @@
 from django.conf import settings
+from django.shortcuts import redirect
 
 from djangotools.common.errors import UnauthorizedException
 import datetime
@@ -34,8 +35,10 @@ class ContextData:
     need_auth = True
     redirect = True
     action_params = True
-
+    preferences_class = None
     default_action = None
+    context_to_string = True
+    redirect_login = False
 
     def is_mobile(self, request):
         ua = request.headers.get("user-agent", "").lower()
@@ -46,8 +49,14 @@ class ContextData:
     def get_context(self, request,  **kwargs):
 
         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:
-            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)
         if "post_action" in kwargs:
@@ -65,16 +74,17 @@ class ContextData:
         else:
             data = {}
         if "data" in kwargs: data.update(kwargs.pop("data"))
-        pref = UserPreferenceManager(request.user)
+
         return {
             "context" : {
                 "page" : self.page,
                 "data" : data,
                 "user" : {
+                    "authenticated" : request.user.is_authenticated,
                     "name" : request.user.username,
                     "id" : request.user.id,
-                    "preferences" : pref.dict,
-                    "profile" : pref.profile,
+                    "preferences" : request.user.pref.dict,
+                    "profile" : request.user.pref.profile,
                     "device": {
                         "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.views.context.base import get_context_class
 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):
@@ -25,7 +25,7 @@ def context(page, data, **kwargs):
 
 
 
-@Router.post(settings.CONTEXT_URL)
+@Router.post(settings.CONTEXT_URL, )
 def raw_context(request, name):
     debug_login(request)
     context_class = get_context_class(name)
@@ -53,7 +53,7 @@ def _render(request, name, page=settings.ROOT_TEMPLATE, *args, **kwargs):
         context = context_class()
         try:
             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"])
             print("context", context.need_auth, data)
         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)
 
 @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)
     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):
     params = request.POST
     redirect = request.GET.get("redirect", "/")