diff --git a/V5.py b/V5.py index c255ae5..1a80f88 100644 --- a/V5.py +++ b/V5.py @@ -1,8 +1,8 @@ from app import app, db -from app.models.users import User +from app.models.users import User, Guest, Member, Group, GroupPrivilege # from app.models.models import Post @app.shell_context_processor def make_shell_context(): - return {'db': db, 'User': User} + return globals() diff --git a/app/models/users.py b/app/models/users.py index b1096fa..68c063d 100644 --- a/app/models/users.py +++ b/app/models/users.py @@ -122,10 +122,10 @@ class Member(User, db.Model): """Check whether the member has the specified privilege.""" if SpecialPrivilege.query.filter_by(mid=self.id, priv=priv).first(): return True - return False -# return db.session.query(User, Group, GroupPrivilege).filter( -# Group.id.in_(User.groups), GroupPrivilege.gid==Group.id, -# GroupPrivilege.priv==priv).first() is not None + return db.session.query(Group, GroupPrivilege).filter( + Group.id.in_([ g.id for g in self.groups ]), + GroupPrivilege.gid==Group.id, + GroupPrivilege.priv==priv).first() is not None def special_privileges(self): """List member's special privileges.""" diff --git a/app/routes/admin/groups.py b/app/routes/admin/groups.py index 3c63894..122e8a8 100644 --- a/app/routes/admin/groups.py +++ b/app/routes/admin/groups.py @@ -12,61 +12,7 @@ import os @app.route('/admin/groups', methods=['GET', 'POST']) @priv_required('access-admin-panel') def adm_groups(): - class GroupRegenerationForm(FlaskForm): - submit = SubmitField( - 'Régénérer les groupes, privilèges, et comptes communs') - - form = GroupRegenerationForm() - if form.validate_on_submit(): - # Clean up groups - for g in Group.query.all(): - g.delete() - - # Create base groups - groups = [] - with open(os.path.join(app.root_path, "data", "groups.yaml")) as fp: - groups = yaml.load(fp.read()) - - for g in groups: - g["obj"] = Group(g["name"], g["css"], g["descr"]) - db.session.add(g["obj"]) - db.session.commit() - - for g in groups: - for priv in g.get("privs", "").split(): - db.session.add(GroupPrivilege(g["obj"], priv)) - db.session.commit() - - # Clean up test members - for name in "PlanèteCasio GLaDOS".split(): - m = Member.query.filter_by(name=name).first() - if m is not None: - m.delete() - - # Create template members - - def addgroup(member, group): - g = Group.query.filter_by(name=group).first() - if g is not None: - member.groups.append(g) - - m = Member('PlanèteCasio', 'contact@planet-casio.com', 'v5-forever') - addgroup(m, "Compte communautaire") - db.session.add(m) - - m = Member('GLaDOS', 'glados@aperture.science', 'v5-forever') - m.xp = 1337 - addgroup(m, "Robot") - db.session.add(m) - db.session.commit() - - db.session.add(SpecialPrivilege(m, "edit-posts")) - db.session.add(SpecialPrivilege(m, "shoutbox-ban")) - - db.session.commit() - users = Member.query.all() groups = Group.query.all() - return render('admin/groups_privileges.html', users=users, groups=groups, - form=form) + return render('admin/groups_privileges.html', users=users, groups=groups) diff --git a/app/templates/admin/groups_privileges.html b/app/templates/admin/groups_privileges.html index b529a6c..5b4900f 100644 --- a/app/templates/admin/groups_privileges.html +++ b/app/templates/admin/groups_privileges.html @@ -49,26 +49,5 @@ {% endfor %} - -

Restauration des groupes et privilèges

- -

Cette fonction régénère un ensemble minimal de groupes et membres - permettant de lancer le forum. Elle opère les modifications - suivantes :

- - - -
- {{ form.hidden_tag() }} - {{ form.submit(class="bg-orange") }} -
{% endblock %} diff --git a/app/utils/priv_required.py b/app/utils/priv_required.py index 86deb49..51564cd 100644 --- a/app/utils/priv_required.py +++ b/app/utils/priv_required.py @@ -26,8 +26,6 @@ def priv_required(*perms): def wrapped(*args, **kwargs): if request.method in EXEMPT_METHODS: return func(*args, **kwargs) - elif app.config.get('LOGIN_DISABLED'): - return func(*args, **kwargs) elif not current_user.is_authenticated: return app.login_manager.unauthorized() else: diff --git a/master.py b/master.py new file mode 100755 index 0000000..4d8887d --- /dev/null +++ b/master.py @@ -0,0 +1,120 @@ +#! /usr/bin/python3 + +from app import app, db +from app.models.users import Member, Group, GroupPrivilege +from app.models.privs import SpecialPrivilege +import os +import sys +import yaml + +help_msg = """ +This is the Planète Casio master shell. Type 'exit' or C-D to leave. + +Type 'members' to see a list of members and 'groups' to see a list of groups. + +Type 'reset-groups-and-privs' to reset all groups and privileges to the +default. This function generates a minimal set of groups and members to prepare +the database. +1. Deletes all groups +2. Creates groups 'Administrateur', 'Modérateur', 'Développeur', 'Rédacteur', + 'Responsable Communauté', 'Partenaire', 'Compte communautaire', 'Robot', and + 'Membre de CreativeCalc' +3. Grants privileges related to these groups +4. Recreates common accounts: 'Planète Casio' (community account) and 'GLaDOS' + (robot) + +Type 'add-group #' to add a new member to a group. +""" + +def members(): + for m in Member.query.all(): + print(m.name) + +def groups(): + for g in Group.query.all(): + print(f"#{g.id} {g.name}") + +def reset_groups_and_privs(): + # Clean up groups + for g in Group.query.all(): + g.delete() + + # Create base groups + groups = [] + with open(os.path.join(app.root_path, "data", "groups.yaml")) as fp: + groups = yaml.load(fp.read()) + + for g in groups: + g["obj"] = Group(g["name"], g["css"], g["descr"]) + db.session.add(g["obj"]) + db.session.commit() + + for g in groups: + for priv in g.get("privs", "").split(): + db.session.add(GroupPrivilege(g["obj"], priv)) + db.session.commit() + + # Clean up test members + for name in "PlanèteCasio GLaDOS".split(): + m = Member.query.filter_by(name=name).first() + if m is not None: + m.delete() + + # Create template members + + def addgroup(member, group): + g = Group.query.filter_by(name=group).first() + if g is not None: + member.groups.append(g) + + m = Member('PlanèteCasio', 'contact@planet-casio.com', 'v5-forever') + addgroup(m, "Compte communautaire") + db.session.add(m) + + m = Member('GLaDOS', 'glados@aperture.science', 'v5-forever') + m.xp = 1338 + addgroup(m, "Robot") + db.session.add(m) + db.session.commit() + + db.session.add(SpecialPrivilege(m, "edit-posts")) + db.session.add(SpecialPrivilege(m, "shoutbox-ban")) + + db.session.commit() + + +def add_group(member, group): + if group[0] != '#': + print("error: group id should start with '#'.") + return + gid = int(group[1:]) + + g = Group.query.filter_by(id=gid).first() + m = Member.query.filter_by(name=member).first() + + m.groups.append(g) + db.session.add(m) + db.session.commit() + +print(help_msg) + +commands = { + "exit": lambda: sys.exit(0), + "members": members, + "groups": groups, + "reset-groups-and-privs": reset_groups_and_privs, + "add-group": add_group, +} + +while True: + try: + print('> ', end='') + cmd = input().split() + except EOFError: + sys.exit(0) + + if not cmd: continue + if cmd[0] not in commands: + print("error: unknown command.") + else: + commands[cmd[0]](*cmd[1:])