diff --git a/ordr3/resources.py b/ordr3/resources.py index c95c8d4..c67d063 100644 --- a/ordr3/resources.py +++ b/ordr3/resources.py @@ -3,7 +3,6 @@ import abc from pyramid.security import Allow, Everyone, Authenticated -from sqlalchemy.inspection import inspect class BaseResource(abc.ABC): @@ -31,16 +30,22 @@ class BaseResource(abc.ABC): child_node_class = self.nodes[key] return child_node_class(key, self) + +class User(BaseResource): + def __acl__(self): + """ access controll list """ + acl = [ + (Allow, "role:admin", "view"), + (Allow, "role:admin", "edit"), + ] + if not self.model.is_active: + acl.append((Allow, "role:admin", "delete")) + return acl + @classmethod - def from_sqla(cls, sql_model_instance, parent): + def from_model(cls, model, parent): """ initializes a resource from an SQLalchemy object """ - primary_keys = inspect(sql_model_instance).identity - if primary_keys is None: - raise ValueError("Cannot init resource for primary key: None") - elif len(primary_keys) != 1: - raise ValueError("Cannot init resource for composite primary key") - primary_key = str(primary_keys[0]) - return cls(primary_key, parent, sql_model_instance) + return cls(model.username, parent, model) class UserList(BaseResource): @@ -48,6 +53,14 @@ class UserList(BaseResource): """ access controll list """ return [(Allow, "role:admin", "view")] + def __getitem__(self, key): + """ returns child resources """ + try: + user = self.request.repo.get_user_by_username(key) + return User.from_model(user, self) + except StopIteration as e: + raise KeyError from e + class Root(BaseResource): """ Root resource """ diff --git a/ordr3/schemas/account.py b/ordr3/schemas/account.py index 2556064..92d9cde 100644 --- a/ordr3/schemas/account.py +++ b/ordr3/schemas/account.py @@ -4,6 +4,9 @@ import deform import colander from .base import CSRFSchema +from ..models import UserRole + +ROLES = [(role.name, role.name.capitalize()) for role in UserRole] @colander.deferred @@ -117,7 +120,7 @@ class ResetPasswordSchema(CSRFSchema): class MyAccountSchema(CSRFSchema): - """ edit an account """ + """ edit the own account """ user_name = colander.SchemaNode( colander.String(), @@ -141,3 +144,33 @@ class MyAccountSchema(CSRFSchema): } settings.update(override) return super().as_form(request, **settings) + + +class EditAccountSchema(CSRFSchema): + """ edit an account """ + + user_name = colander.SchemaNode( + colander.String(), + widget=deform.widget.TextInputWidget( + template="textinput_disabled.pt", css_class="o3-reg-username" + ), + ) + role = colander.SchemaNode( + colander.String(), widget=deform.widget.SelectWidget(values=ROLES) + ) + first_name = colander.SchemaNode(colander.String(),) + last_name = colander.SchemaNode(colander.String(),) + email = colander.SchemaNode( + colander.String(), + validator=colander.Email(), + widget=deform.widget.TextInputWidget(template="email.pt",), + ) + + @classmethod + def as_form(cls, request, **override): + settings = { + "buttons": ("Save Changes", "Cancel"), + "css_class": "form-horizontal registration", + } + settings.update(override) + return super().as_form(request, **settings) diff --git a/ordr3/static/style.css b/ordr3/static/style.css index 783b8ff..e8b9ce9 100644 --- a/ordr3/static/style.css +++ b/ordr3/static/style.css @@ -136,3 +136,7 @@ td.o3-actions a:hover { .infinite-more-link td { text-align:center; } + +.o3-alerts { + max-width: 16.666667%; + } diff --git a/ordr3/templates/account/myaccount.jinja2 b/ordr3/templates/account/myaccount.jinja2 index 0ee4b14..69be72a 100644 --- a/ordr3/templates/account/myaccount.jinja2 +++ b/ordr3/templates/account/myaccount.jinja2 @@ -4,7 +4,6 @@ {% block content %} -

Edit your account

{{form.render()|safe}} diff --git a/ordr3/templates/emails/activation.jinja2 b/ordr3/templates/emails/activation.jinja2 new file mode 100644 index 0000000..dc9bc0b --- /dev/null +++ b/ordr3/templates/emails/activation.jinja2 @@ -0,0 +1,11 @@ +Dear {{ user.first_name }}, + +Your account was activated by {{ request.user.first_name }}. + +You can now log in at {{ request.resource_url(request.root) }} and order some stuff. + +Regards, +The Ordr System + +-- +Please don't respont to this email! This is an automatically generated notification. diff --git a/ordr3/templates/layout_full.jinja2 b/ordr3/templates/layout_full.jinja2 index 24975d5..9730b9f 100644 --- a/ordr3/templates/layout_full.jinja2 +++ b/ordr3/templates/layout_full.jinja2 @@ -24,32 +24,40 @@ ordr