Maarten van den Berg 6 years ago
parent
commit
20678a2668

+ 14 - 4
piket_client/gui.py

117
         """ Initialize UI: build GridLayout, retrieve People and build a button
117
         """ Initialize UI: build GridLayout, retrieve People and build a button
118
         for each. """
118
         for each. """
119
 
119
 
120
-        ps = Person.get_all()
120
+        ps = Person.get_all(True)
121
         num_columns = round(len(ps) / 10) + 1
121
         num_columns = round(len(ps) / 10) + 1
122
 
122
 
123
         if self.layout:
123
         if self.layout:
263
     def add_person(self) -> None:
263
     def add_person(self) -> None:
264
         """ Ask for a new Person and register it, then rebuild the central
264
         """ Ask for a new Person and register it, then rebuild the central
265
         widget. """
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
         self.show_keyboard()
270
         self.show_keyboard()
267
         name, ok = QInputDialog.getItem(
271
         name, ok = QInputDialog.getItem(
268
             self,
272
             self,
269
             "Persoon toevoegen",
273
             "Persoon toevoegen",
270
             "Voer de naam van de nieuwe persoon in, of kies uit de lijst.",
274
             "Voer de naam van de nieuwe persoon in, of kies uit de lijst.",
271
-            ["Cas", "Frenk"],
275
+            inactive_names,
272
             0,
276
             0,
273
             True,
277
             True,
274
         )
278
         )
275
         self.hide_keyboard()
279
         self.hide_keyboard()
276
         if ok and name:
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
             self.main_widget.init_ui()
290
             self.main_widget.init_ui()
281
 
291
 

+ 3 - 2
piket_client/model.py

97
             return None
97
             return None
98
 
98
 
99
     @classmethod
99
     @classmethod
100
-    def get_all(cls) -> ["Person"]:
100
+    def get_all(cls, active=None) -> ["Person"]:
101
         """ Get all active People. """
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
         try:
105
         try:
105
             data = req.json()
106
             data = req.json()

+ 19 - 0
piket_server/__init__.py

29
 
29
 
30
     person_id = db.Column(db.Integer, primary_key=True)
30
     person_id = db.Column(db.Integer, primary_key=True)
31
     name = db.Column(db.String, nullable=False)
31
     name = db.Column(db.String, nullable=False)
32
+    active = db.Column(db.Boolean, nullable=False, default=False)
32
 
33
 
33
     consumptions = db.relationship("Consumption", backref="person", lazy=True)
34
     consumptions = db.relationship("Consumption", backref="person", lazy=True)
34
 
35
 
136
 def get_people():
137
 def get_people():
137
     """ Return a list of currently known people. """
138
     """ Return a list of currently known people. """
138
     people = Person.query.order_by(Person.name).all()
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
     result = [person.as_dict for person in people]
144
     result = [person.as_dict for person in people]
140
     return jsonify(people=result)
145
     return jsonify(people=result)
141
 
146
 
189
 
194
 
190
     return jsonify(person=person.as_dict, consumption=consumption.as_dict), 201
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
 @app.route("/people/<int:person_id>/add_consumption/<int:ct_id>", methods=["POST"])
212
 @app.route("/people/<int:person_id>/add_consumption/<int:ct_id>", methods=["POST"])
194
 def add_consumption2(person_id: int, ct_id: int):
213
 def add_consumption2(person_id: int, ct_id: int):

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

21
         "people",
21
         "people",
22
         sa.Column("person_id", sa.Integer, primary_key=True),
22
         sa.Column("person_id", sa.Integer, primary_key=True),
23
         sa.Column("name", sa.String, nullable=False),
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
     parser_clear.add_argument("--removemydata", action="store_true")
21
     parser_clear.add_argument("--removemydata", action="store_true")
22
 
22
 
23
     # Parser load_seeds
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
     args = parser.parse_args()
29
     args = parser.parse_args()
27
     args.func(args)
30
     args.func(args)
59
 
62
 
60
     print("Aborting.")
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
 if __name__ == "__main__":
85
 if __name__ == "__main__":
64
     main()
86
     main()