home · contact · privacy
Add foreign key restraints, expand and fix tests, add deletion and forking.
[misc] / income_progress_bars.py
index 553627d3788f2f44a0be3fa605453e021f79ac27..5d9a887323feb2cc7da85f1e81dae7bc696d83f2 100644 (file)
@@ -1,7 +1,7 @@
 import os
 import json
 import jinja2
-from plomlib import PlomDB, PlomException, run_server, run_server, PlomServer
+from plomlib import PlomDB, PlomException, run_server, PlomHandler 
 
 server_port = 8083
 db_path = '/home/plom/org/income.json'
@@ -84,7 +84,7 @@ table {
 <td class="progressbar surplusbar"><div class="diff_goal">{{p.diff_goal}}</div><div class="progressbar surplus" style="width: {{p.success_income_bonus}}px" ></div></td></tr>
 {% endfor %}</table>
 
-<form action="/" method="POST">
+<form action="{{homepage}}" method="POST">
 <table>
 <tr><th>hourly rate</th><th>worked today</th></tr>
 <tr><td class="input_container"><input type="number" min="1" class="rate" name="workday_hourly_rate_1" value="{{workday_hourly_rate_1}}"/>€</td><td><input type="number" min="0" class="minutes" name="workday_minutes_worked_1" value="{{workday_minutes_worked_1}}" step="5" /> minutes</td>
@@ -161,99 +161,108 @@ class ProgressBar:
                 self.success = success_income / time_progress
 
 
-class IncomeServer(PlomServer):
+class IncomeProgressHandler(PlomHandler):
+    
+    def app_init(self, handler):
+        default_path = '/income_progress'
+        handler.add_route('GET', default_path, self.display_income_progress) 
+        handler.add_route('POST', default_path, self.post_income_update) 
+        return 'income_progress', default_path 
 
     def do_POST(self):
+        self.try_do(self.post_income_update)
+
+    def post_income_update(self):
         from urllib.parse import parse_qs
-        try:
-            length = int(self.headers['content-length'])
-            postvars = parse_qs(self.rfile.read(length).decode(), keep_blank_values=1)
-            db = IncomeDB()
-            db.workday_minutes_worked_1 = int(postvars['workday_minutes_worked_1'][0])
-            db.workday_minutes_worked_2 = int(postvars['workday_minutes_worked_2'][0])
-            db.workday_minutes_worked_3 = int(postvars['workday_minutes_worked_3'][0])
-            db.workday_hourly_rate_1 = int(postvars['workday_hourly_rate_1'][0])
-            db.workday_hourly_rate_2 = int(postvars['workday_hourly_rate_2'][0])
-            db.workday_hourly_rate_3 = int(postvars['workday_hourly_rate_3'][0])
-            db.year_goal = int(postvars['year_goal'][0])
-            db.workdays_per_month = int(postvars['workdays_per_month'][0])
-            if 'finish' in postvars.keys():
-                day_income = (db.workday_minutes_worked_1 / 60.0) * db.workday_hourly_rate_1
-                day_income += (db.workday_minutes_worked_2 / 60.0) * db.workday_hourly_rate_2
-                day_income += (db.workday_minutes_worked_3 / 60.0) * db.workday_hourly_rate_3
-                db.year_income += day_income
-                db.month_income += day_income
-                db.week_income += day_income
-                db.workday_minutes_worked_1 = 0
-                db.workday_minutes_worked_2 = 0
-                db.workday_minutes_worked_3 = 0
-            db.write_db()
-            self.redirect()
-        except PlomException as e:
-            self.fail_400(e) 
+        length = int(self.headers['content-length'])
+        postvars = parse_qs(self.rfile.read(length).decode(), keep_blank_values=1)
+        db = IncomeDB()
+        db.workday_minutes_worked_1 = int(postvars['workday_minutes_worked_1'][0])
+        db.workday_minutes_worked_2 = int(postvars['workday_minutes_worked_2'][0])
+        db.workday_minutes_worked_3 = int(postvars['workday_minutes_worked_3'][0])
+        db.workday_hourly_rate_1 = int(postvars['workday_hourly_rate_1'][0])
+        db.workday_hourly_rate_2 = int(postvars['workday_hourly_rate_2'][0])
+        db.workday_hourly_rate_3 = int(postvars['workday_hourly_rate_3'][0])
+        db.year_goal = int(postvars['year_goal'][0])
+        db.workdays_per_month = int(postvars['workdays_per_month'][0])
+        if 'finish' in postvars.keys():
+            day_income = (db.workday_minutes_worked_1 / 60.0) * db.workday_hourly_rate_1
+            day_income += (db.workday_minutes_worked_2 / 60.0) * db.workday_hourly_rate_2
+            day_income += (db.workday_minutes_worked_3 / 60.0) * db.workday_hourly_rate_3
+            db.year_income += day_income
+            db.month_income += day_income
+            db.week_income += day_income
+            db.workday_minutes_worked_1 = 0
+            db.workday_minutes_worked_2 = 0
+            db.workday_minutes_worked_3 = 0
+        db.write_db()
+        homepage = self.apps['income_progress'] if hasattr(self, 'apps') else self.homepage
+        self.redirect(homepage)
 
     def do_GET(self):
+        self.try_do(self.display_income_progress)
+
+    def display_income_progress(self):
         import datetime
         import calendar
-        try:
-            db = IncomeDB()
-            today = datetime.datetime.now()
-            update_db = False
-            if today.year != db.timestamp_year:
-                db.timestamp_year = today.year
-                db.timestamp_month = today.month
-                db.year_income = 0
-                db.month_income = 0
-                update_db = True
-            if today.month != db.timestamp_month:
-                db.timestamp_month = today.month
-                db.month_income = 0
-                update_db = True
-            if today.isocalendar()[1] != db.timestamp_week:
-                db.timestamp_week = today.isocalendar()[1]
-                db.week_income = 0
-                update_db = True
-            if update_db:
-                print("Resetting timestamp")
-                db.write_db()
-            day_of_year = today.toordinal() - datetime.date(today.year, 1, 1).toordinal() + 1
-            year_length = 365 + calendar.isleap(today.year)
-            workday_goal = db.year_goal / 12 / db.workdays_per_month
-            workdays_per_week = (db.workdays_per_month * 12) / (year_length / 7)
-            month_goal = db.year_goal / 12
-            week_goal = db.year_goal / (year_length / 7)
-            day_income = (db.workday_minutes_worked_1 / 60.0) * db.workday_hourly_rate_1
-            day_income += (db.workday_minutes_worked_2 / 60.0) * db.workday_hourly_rate_2
-            day_income += (db.workday_minutes_worked_3 / 60.0) * db.workday_hourly_rate_3
-            year_plus = db.year_income + day_income
-            month_plus = db.month_income + day_income
-            week_plus = db.week_income + day_income
-            progress_time_year = day_of_year / year_length
-            progress_time_month = today.day / calendar.monthrange(today.year, today.month)[1]
-            progress_time_week = today.weekday() / 7
-            progress_bars = [ProgressBar("year", year_plus, db.year_goal, progress_time_year),
-                             ProgressBar("month", month_plus, month_goal, progress_time_month),
-                             ProgressBar("week", week_plus, week_goal, progress_time_week),
-                             ProgressBar("workday", day_income, workday_goal)]
-            page = jinja2.Template(tmpl).render(
-                    progress_bars = progress_bars,
-                    workday_hourly_rate_1 = db.workday_hourly_rate_1,
-                    workday_minutes_worked_1 = db.workday_minutes_worked_1,
-                    workday_hourly_rate_2 = db.workday_hourly_rate_2,
-                    workday_minutes_worked_2 = db.workday_minutes_worked_2,
-                    workday_hourly_rate_3 = db.workday_hourly_rate_3,
-                    workday_minutes_worked_3 = db.workday_minutes_worked_3,
-                    year_goal = db.year_goal,
-                    month_goal = month_goal,
-                    week_goal = week_goal,
-                    workdays_per_month = db.workdays_per_month,
-                    workday_goal = workday_goal,
-                    workdays_per_week = workdays_per_week,
-                    )
-            self.send_HTML(page)
-        except PlomException as e:
-            self.fail_400(e) 
+        db = IncomeDB()
+        today = datetime.datetime.now()
+        update_db = False
+        if today.year != db.timestamp_year:
+            db.timestamp_year = today.year
+            db.timestamp_month = today.month
+            db.year_income = 0
+            db.month_income = 0
+            update_db = True
+        if today.month != db.timestamp_month:
+            db.timestamp_month = today.month
+            db.month_income = 0
+            update_db = True
+        if today.isocalendar()[1] != db.timestamp_week:
+            db.timestamp_week = today.isocalendar()[1]
+            db.week_income = 0
+            update_db = True
+        if update_db:
+            print("Resetting timestamp")
+            db.write_db()
+        day_of_year = today.toordinal() - datetime.date(today.year, 1, 1).toordinal() + 1
+        year_length = 365 + calendar.isleap(today.year)
+        workday_goal = db.year_goal / 12 / db.workdays_per_month
+        workdays_per_week = (db.workdays_per_month * 12) / (year_length / 7)
+        month_goal = db.year_goal / 12
+        week_goal = db.year_goal / (year_length / 7)
+        day_income = (db.workday_minutes_worked_1 / 60.0) * db.workday_hourly_rate_1
+        day_income += (db.workday_minutes_worked_2 / 60.0) * db.workday_hourly_rate_2
+        day_income += (db.workday_minutes_worked_3 / 60.0) * db.workday_hourly_rate_3
+        year_plus = db.year_income + day_income
+        month_plus = db.month_income + day_income
+        week_plus = db.week_income + day_income
+        progress_time_year = day_of_year / year_length
+        progress_time_month = today.day / calendar.monthrange(today.year, today.month)[1]
+        progress_time_week = today.weekday() / 7
+        progress_bars = [ProgressBar("year", year_plus, db.year_goal, progress_time_year),
+                         ProgressBar("month", month_plus, month_goal, progress_time_month),
+                         ProgressBar("week", week_plus, week_goal, progress_time_week),
+                         ProgressBar("workday", day_income, workday_goal)]
+        homepage = self.apps['income_progress'] if hasattr(self, 'apps') else self.homepage
+        page = jinja2.Template(tmpl).render(
+                homepage = homepage,
+                progress_bars = progress_bars,
+                workday_hourly_rate_1 = db.workday_hourly_rate_1,
+                workday_minutes_worked_1 = db.workday_minutes_worked_1,
+                workday_hourly_rate_2 = db.workday_hourly_rate_2,
+                workday_minutes_worked_2 = db.workday_minutes_worked_2,
+                workday_hourly_rate_3 = db.workday_hourly_rate_3,
+                workday_minutes_worked_3 = db.workday_minutes_worked_3,
+                year_goal = db.year_goal,
+                month_goal = month_goal,
+                week_goal = week_goal,
+                workdays_per_month = db.workdays_per_month,
+                workday_goal = workday_goal,
+                workdays_per_week = workdays_per_week,
+                )
+        self.send_HTML(page)
 
 
 if __name__ == "__main__":       
-    run_server(server_port, IncomeServer)
+    run_server(server_port, IncomeProgressHandler)