Maarten van den Berg 6 years ago
parent
commit
20678a2668

+ 14 - 4
piket_client/gui.py

@@ -117,7 +117,7 @@ class NameButtons(QWidget):
117 117
         """ Initialize UI: build GridLayout, retrieve People and build a button
118 118
         for each. """
119 119
 
120
-        ps = Person.get_all()
120
+        ps = Person.get_all(True)
121 121
         num_columns = round(len(ps) / 10) + 1
122 122
 
123 123
         if self.layout:
@@ -263,19 +263,29 @@ class PiketMainWindow(QMainWindow):
263 263
     def add_person(self) -> None:
264 264
         """ Ask for a new Person and register it, then rebuild the central
265 265
         widget. """
266
+        inactive_persons = Person.get_all(False)
267
+        inactive_persons.sort(key=lambda p: p.name)
268
+        inactive_names = [p.name for p in inactive_persons]
269
+
266 270
         self.show_keyboard()
267 271
         name, ok = QInputDialog.getItem(
268 272
             self,
269 273
             "Persoon toevoegen",
270 274
             "Voer de naam van de nieuwe persoon in, of kies uit de lijst.",
271
-            ["Cas", "Frenk"],
275
+            inactive_names,
272 276
             0,
273 277
             True,
274 278
         )
275 279
         self.hide_keyboard()
276 280
         if ok and name:
277
-            person = Person(name=name)
278
-            person = person.create()
281
+
282
+            if name in inactive_names:
283
+                person = inactive_persons[inactive_names.index(name)]
284
+                person.make_active()
285
+
286
+            else:
287
+                person = Person(name=name)
288
+                person = person.create()
279 289
 
280 290
             self.main_widget.init_ui()
281 291
 

+ 3 - 2
piket_client/model.py

@@ -97,9 +97,10 @@ class Person(NamedTuple):
97 97
             return None
98 98
 
99 99
     @classmethod
100
-    def get_all(cls) -> ["Person"]:
100
+    def get_all(cls, active=None) -> ["Person"]:
101 101
         """ Get all active People. """
102
-        req = requests.get(urljoin(SERVER_URL, "/people"))
102
+        req = requests.get(urljoin(SERVER_URL, "/people"),
103
+                params={'active':active})
103 104
 
104 105
         try:
105 106
             data = req.json()

+ 19 - 0
piket_server/__init__.py

@@ -29,6 +29,7 @@ class Person(db.Model):
29 29
 
30 30
     person_id = db.Column(db.Integer, primary_key=True)
31 31
     name = db.Column(db.String, nullable=False)
32
+    active = db.Column(db.Boolean, nullable=False, default=False)
32 33
 
33 34
     consumptions = db.relationship("Consumption", backref="person", lazy=True)
34 35
 
@@ -136,6 +137,10 @@ def ping() -> None:
136 137
 def get_people():
137 138
     """ Return a list of currently known people. """
138 139
     people = Person.query.order_by(Person.name).all()
140
+    q = Person.query.order_by(Person.name)
141
+    if request.args.get('active'):
142
+        q = q.filter_by(active=bool(request.args.get('active')))
143
+    people = q.all()
139 144
     result = [person.as_dict for person in people]
140 145
     return jsonify(people=result)
141 146
 
@@ -189,6 +194,20 @@ def add_consumption(person_id: int):
189 194
 
190 195
     return jsonify(person=person.as_dict, consumption=consumption.as_dict), 201
191 196
 
197
+@app.route("/people/<int:person_id>", methods=["PATCH"])
198
+def update_person(person_id: int):
199
+    person = Person.query.get_or_404(person_id)
200
+
201
+    data = requests.json['person']
202
+
203
+    if 'active' in data:
204
+        person.active = data['active']
205
+
206
+        db.session.add(person)
207
+        db.session.commit()
208
+
209
+        return jsonify(person=person)
210
+
192 211
 
193 212
 @app.route("/people/<int:person_id>/add_consumption/<int:ct_id>", methods=["POST"])
194 213
 def add_consumption2(person_id: int, ct_id: int):

+ 1 - 0
piket_server/alembic/versions/a09086bfe84c_create_persons_table.py

@@ -21,6 +21,7 @@ def upgrade():
21 21
         "people",
22 22
         sa.Column("person_id", sa.Integer, primary_key=True),
23 23
         sa.Column("name", sa.String, nullable=False),
24
+        sa.Column("active", sa.Boolean, server_default="FALSE", nullable=False),
24 25
     )
25 26
 
26 27
 

+ 23 - 1
piket_server/seed.py

@@ -21,7 +21,10 @@ def main():
21 21
     parser_clear.add_argument("--removemydata", action="store_true")
22 22
 
23 23
     # Parser load_seeds
24
-    # TODO
24
+    parser_load_persons = subparsers.add_parser("load_persons",
25
+            help="Load Person data.")
26
+    parser_load_persons.set_defaults(func=cmd_load_persons)
27
+    parser_load_persons.add_argument('datafile')
25 28
 
26 29
     args = parser.parse_args()
27 30
     args.func(args)
@@ -59,6 +62,25 @@ def cmd_clear(args) -> None:
59 62
 
60 63
     print("Aborting.")
61 64
 
65
+def cmd_load_persons(args) -> None:
66
+    """ Entrypoint for 'load_persons" subcommand. """
67
+
68
+    print("Loading persons.")
69
+
70
+    with open(args.datafile) as csvfile:
71
+        reader = csv.DictReader(csvfile)
72
+
73
+        for row in reader:
74
+            p = Person(
75
+                name=row['name'],
76
+                active=bool(row['active'])
77
+            )
78
+            db.session.add(p)
79
+
80
+    db.session.commit()
81
+
82
+    print("Done.")
83
+
62 84
 
63 85
 if __name__ == "__main__":
64 86
     main()