fanch 1 år sedan
förälder
incheckning
0e44f3d276

+ 1 - 1
setup.py

@@ -29,7 +29,7 @@ def get_files(path):
 
 setup(
     name="baby",
-    version="0.1.1.dev2",
+    version="0.1.2",
     description="A short description of the project.",
     author="François GAUTRAIS",
     install_requires=install_requires,

+ 50 - 17
src/baby/app/context/edit.py

@@ -1,6 +1,6 @@
 import datetime
 
-from djangotools.common.types import date_to_string
+from djangotools.common.types import date_to_string, parse_date
 from baby.app.context.base import BaseContextData, UserPrefences
 from baby.app.models.regle import Regle
 
@@ -9,24 +9,57 @@ class EditData(BaseContextData):
     page = "edit"
 
 
+    def _send(self, user, debut, status=None, message=None):
+        fin = datetime.date(debut.year + 1, 1, 1)
+
+        regles = Regle.objects.filter(user=user, date__gte=debut, date__lt=fin).order_by("-date")
+        return {
+            "year": debut.year,
+            "dates": [{"date": date_to_string(x.date), "id": x.id} for x in regles],
+            "prev": debut.year - 1,
+            "next": debut.year + 1,
+            "count": len(regles),
+            "title": "Editer les cycles",
+            "is_post" : message is not None,
+            "message" : message,
+            "status" : status
+        }
+
+    def _delete(self, user, date):
+        debut = datetime.date(date.year, 1 , 1)
+        message = f"La règle du {date_to_string(date)} a bien été supprimeé"
+        status = True
+        parsed_date = parse_date(date)
+        regle=None
+        try:
+            regle = Regle.objects.get(user=user,  date=parsed_date)
+        except Regle.DoesNotExist:
+            message = f"Erreur aucune règle n'est enregistré au {date_to_string(date)}"
+            status = False
+
+        if regle is not None:
+            try:
+                regle.delete()
+            except Exception as err:
+                message = f"Impossible de supprimer la règle du {date_to_string(date)} : {err}"
+                status = False
+
+        return self._send(user, debut, status, message)
+
+
+
     def get_context_data(self, request, action_params, **kwargs):
         user = request.user
         debut = datetime.date.today()
-        if "year" in getattr(request, "GET", {}):
-            debut =datetime.date(int(request.GET["year"]), 1, 1)
-        elif "year" in getattr(request, "POST", {}):
-            debut = datetime.date(int(request.POST["year"]), 1, 1)
-        else:
-            debut = datetime.date(debut.year, 1 , 1)
 
-        fin = datetime.date(debut.year+1, 1, 1)
+        if "delete_date" in getattr(request, "GET", {}):
+            return self._delete(user, parse_date(request.GET["delete_date"]))
+        else:
+            if "year" in getattr(request, "GET", {}):
+                debut =datetime.date(int(request.GET["year"]), 1, 1)
+            elif "year" in getattr(request, "POST", {}):
+                debut = datetime.date(int(request.POST["year"]), 1, 1)
+            else:
+                debut = datetime.date(debut.year, 1 , 1)
 
-        regles = Regle.objects.filter(user=user, date__gte=debut, date__lt=fin)
-        return {
-            "year" : debut.year,
-            "dates" : [{"date": date_to_string(x.date), "id": x.id} for x in regles],
-            "prev" : debut.year - 1,
-            "next" : debut.year + 1,
-            "count" : len(regles),
-            "title" : "Editer les cycles"
-        }
+            return self._send(user, debut)

+ 5 - 1
src/baby/app/context/login.py

@@ -12,6 +12,10 @@ class EditData(BaseContextData):
     need_auth = False
 
     def get_context_data(self, request, action_params, **kwargs):
+
+        message = kwargs.get("data", {}).get("error")
         return {
-            "title" : "Login"
+            "title" : "Login",
+            "is_fail" : message is not None,
+            "message" : message
         }

+ 10 - 7
src/baby/app/context/new_cycle.py

@@ -21,11 +21,11 @@ class ContextData(BaseContextData):
                 "is_post" : True
             })
         else:
-            ret["is_post"] = True
+            ret["is_post"] = False
         return ret
     def _post(self, request):
         user = request.user
-        params = request.GET
+        params = request.GET or request.POST
         force = params.get("force", False)
         date = params.get("date",datetime.date.today())
         if isinstance(date, (list, tuple)):
@@ -39,16 +39,19 @@ class ContextData(BaseContextData):
             days_from_begin = (today - last.date).days
 
             if days_from_begin == 0:
-                self.ret(False, "Le cycle a déja été initialisé aujourd'hui")
+                return self.ret(False, "Le cycle a déja été initialisé aujourd'hui")
 
             if days_from_begin < get_min_period(user) and not force:
-                self.ret(False, "Le cycle est trop court")
+                return self.ret(False, "Le cycle est trop court")
+        try:
+            Regle.objects.create(user, today)
+        except Regle.DoesNotExist:
+            return self.ret(False, "Le cycle a déja été initialisé aujourd'hui")
 
-        Regle.objects.create(user, today)
-        self.ret(True, "Le nouveau cycle a bien été pris en compte")
+        return self.ret(True, "Le nouveau cycle a bien été pris en compte")
 
     def get_context_data(self, request, action_params, **kwargs):
-        if request.method=="POST":
+        if request.method=="POST" or request.GET.get("validate") is not None :
             return self._post(request)
         else:
             return self.ret()

+ 3 - 1
src/baby/app/views/main.py

@@ -5,11 +5,13 @@ pages = [
     ("", "index", "index.html"),
     ("edit", "edit", "edit.html"),
     ("calendar", "calendar", "calendar.html"),
-    ("new_cycle", "new_cycle", "new_cycle.html"),
     ("validate_cycle", "validate_cycle", "validate_cycle.html"),
     ("stats", "stats", "stats.html"),
 ]
 
 Router.route("parameters", {"POST", "GET"})(render_page("parameters", "parameters.html", context_to_string=False))
+Router.route("new_cycle", {"POST", "GET"})(render_page("new_cycle", "new_cycle.html", context_to_string=False))
+
+
 for url, context, template in pages:
     Router.get(url, need_auth=True)(render_page(context, template, context_to_string=False))

+ 1 - 1
src/baby/frontend/static/css/calendar/calendar.css

@@ -11,7 +11,6 @@
     text-decoration: none;
     cursor: pointer;
     font-size: 24pt;
-    margin-left: 10px;
     font-weight: 700;
 }
 
@@ -19,6 +18,7 @@
     font-size: 22pt;
     font-weight: 600;
     margin-right: 10px;
+    margin-left: 10px;
     
 }
 

+ 1 - 1
src/baby/frontend/static/css/edit/edit.css

@@ -11,7 +11,6 @@
     text-decoration: none;
     cursor: pointer;
     font-size: 24pt;
-    margin-left: 10px;
     font-weight: 700;
 }
 
@@ -19,6 +18,7 @@
     font-size: 22pt;
     font-weight: 600;
     margin-right: 10px;
+    margin-left: 10px;
     
 }
 

+ 20 - 1
src/baby/frontend/templates/edit.html

@@ -15,6 +15,19 @@
 <body>
     {% include "nav.html" %}
     <main class="container">
+        {% if context.data.is_post %}
+            {% if context.data.status %}
+                <div class="message-success" onclick="remove_message()">
+                    {{context.data.message}}
+                </div>
+            {% else %}
+                <div class="message-fail"  onclick="remove_message()">
+                    {{context.data.message}}
+                </div>
+            {% endif %}
+        {% endif %}
+
+
         <div class="row tile-holder">
             <div class="header-month">
                 <a class="header-month-prev_month" onclick="location.search='?year={{context.data.prev}}'">
@@ -82,8 +95,14 @@
         }
 
         function on_remove_regle(){
-            location.href = "/delete_regle?date="+dest_date;
+            location.href = "/edit?delete_date="+dest_date;
         }
+        
+        function  remove_message(){
+            $(".message-fail").remove();
+            $(".message-success").remove();
+            $(".invalid-feedback").show()
+        }   
 
     </script>
 </body>

+ 14 - 1
src/baby/frontend/templates/login.html

@@ -15,9 +15,15 @@
 <body>
     {% include "nav.html" %}
     <main class="container">
+
+        {% if context.data.is_fail %}
+            <div class="message-fail"  onclick="remove_message()">
+                {{context.data.message}}
+            </div>
+        {% endif %}
         <div class="card">
             <div class="card-body">
-                <form class="stats-period-selector-form" action="auth" method="post">
+                <form class="stats-period-selector-form" action="auth" method="POST">
                     <h5 class="card-title">Login</h5>
                     <p class="card-text">Entrez votre login et mot de passe</p>
                         <div class="input-group mb-3">
@@ -40,5 +46,12 @@
 
     <script src="{{context.base_url}}/static/js/vendor/jquery.js"></script>
     <script src="{{context.base_url}}/static/js/vendor/bootstrap.js"></script>
+    <script>
+        function  remove_message(){
+            $(".message-fail").remove();
+            $(".message-success").remove();
+            $(".invalid-feedback").show()
+        }   
+    </script>
 </body>
 </html>

+ 3 - 10
src/baby/frontend/templates/nav.html

@@ -1,27 +1,20 @@
 <nav class="navbar navbar-expand-lg">
     
     <div class="container-fluid">
-        <a class="navbar-brand nav-home" href="{{context.base_url}}"><i class="bi-house"></i></a>
+        <a class="navbar-brand nav-home" href="{{context.base_url}}/"><i class="bi-house"></i></a>
         <a class="nav-titre navbar-brand">{{context.data.title}}</a>
         <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
             <span class="navbar-toggler-icon"></span>
         </button>
         <div class="collapse navbar-collapse" id="navbarSupportedContent">
         <ul class="navbar-nav me-auto mb-2 mb-lg-0">
-            <!--<li class="nav-item">
-                <a class="nav-link active" aria-current="page" href="#">Home</a>
-            </li>
-            <li class="nav-item">
-                <a class="nav-link" href="#">Link</a>
-            </li> -->
             {% if context.user.authenticated  %}
                 <li class="nav-item"><a class="nav-link" href="{{context.base_url}}/new_cycle">Valider cycle</a></li>
                 <li class="nav-item"><a class="nav-link" href="{{context.base_url}}/calendar">Calendrier</a></li>
                 <li class="nav-item"><a class="nav-link" href="{{context.base_url}}/parameters">Paramètres</a></li>
                 <li class="nav-item"><a class="nav-link" href="{{context.base_url}}/stats">Stats</a></li>
-                <li class="nav-item">
-                    <a class="nav-link" href="{{context.base_url}}//disconnect">Déconnexion</a>
-                </li>
+                <li class="nav-item"><a class="nav-link" href="{{context.base_url}}/edit">Edition</a></li>
+                <li class="nav-item"><a class="nav-link" href="{{context.base_url}}/disconnect">Déconnexion</a></li>
             {% else  %}
             {% endif %}
         </ul>

+ 20 - 2
src/baby/frontend/templates/new_cycle.html

@@ -15,12 +15,23 @@
 <body>
     {% include "nav.html" %}
     <main class="container">
+        {% if context.data.is_post %}
+            {% if context.data.status %}
+                <div class="message-success" onclick="remove_message()">
+                    {{context.data.message}}
+                </div>
+            {% else %}
+                <div class="message-fail"  onclick="remove_message()">
+                    {{context.data.message}}
+                </div>
+            {% endif %}
+        {% endif %}
 
         <!--  Nouveau cycle -->
         <div class="row tile-holder">
 
             <!--  Démarrer aujourd'hui -->
-            <div class="col-6 col-xl-4 tile" onclick="location.pathname = '{{context.base_url}}/new_cycle'">
+            <div class="col-6 col-xl-4 tile" onclick="location.href = '{{context.base_url}}/new_cycle?validate'">
                 <div class="tile-content">
                     <center>
                         <i class="bi bi-check tile-img" ></i>
@@ -35,7 +46,7 @@
             <div class="col-6 col-xl-4 tile">
                 <div class="tile-content">
                     <div class="btn tile-title">
-                        <form action="{{context.base_url}}/new_cycle">
+                        <form action="{{context.base_url}}/new_cycle" method="post">
                             <div class="validate_cycle-label">
                                 Choisir une date
                             </div>
@@ -68,5 +79,12 @@
 
     <script src="{{context.base_url}}/static/js/vendor/jquery.js"></script>
     <script src="{{context.base_url}}/static/js/vendor/bootstrap.js"></script>
+    <script>
+        function  remove_message(){
+            $(".message-fail").remove();
+            $(".message-success").remove();
+            $(".invalid-feedback").show()
+        }   
+    </script>
 </body>
 </html>

+ 4 - 5
src/baby/frontend/templates/parameters.html

@@ -25,9 +25,7 @@
                 <div class="message-fail"  onclick="remove_message()">
                     Des erreurs ont eu lieu, la modification n'a pas eu lieu
                 </div>
-                
             {% endif %}
-                
             {% endif %}
 
 
@@ -101,9 +99,10 @@
         $("select[name='ui.theme']").val('{{context.user.preferences.main.ui.theme}}')
 
         function  remove_message(){
-            $(".post-fail").remove();
-            $(".post-success").remove();
-        }   $(".invalid-feedback").show()
+            $(".message-fail").remove();
+            $(".message-success").remove();
+            $(".invalid-feedback").show()
+        }   
     </script>
     </body>
 </html>

+ 1 - 1
src/baby/settings/__init__.py

@@ -66,5 +66,5 @@ app_dir = BASE_DIR.parent.parent / "data"
 STATICFILES_DIRS = ["frontend/static"]
 TEMPLATES_DIR = ["frontend/templates"]
 ROOT_TEMPLATE="index.html"
-BASE_URL="baby/app/"
+BASE_URL=""
 CONFIG = load_settings(globals())