Browse Source

added vendor resources

funding-tag
Holger Frey 5 years ago
parent
commit
550625320f
  1. 3
      ordr3/models.py
  2. 17
      ordr3/repo.py
  3. 34
      ordr3/resources.py
  4. 2
      ordr3/services.py
  5. 2
      ordr3/templates/orders/list_content.jinja2
  6. 22
      ordr3/templates/vendors/list.jinja2
  7. 4
      ordr3/views/root.py
  8. 20
      ordr3/views/vendors.py

3
ordr3/models.py

@ -1,6 +1,8 @@
import enum import enum
from datetime import datetime, timedelta from datetime import datetime, timedelta
from collections import namedtuple
VendorAggregate = namedtuple("VendorAggregate", ["name", "terms"])
@enum.unique @enum.unique
class OrderStatus(enum.Enum): class OrderStatus(enum.Enum):
@ -158,7 +160,6 @@ class Vendor(Model):
self.term = term self.term = term
self.name = name self.name = name
class User(Model): class User(Model):
id = None id = None

17
ordr3/repo.py

@ -64,6 +64,10 @@ class AbstractOrderRepository(abc.ABC):
def search_vendor(self, reference): def search_vendor(self, reference):
""" search for a vendor by its canonical name """ """ search for a vendor by its canonical name """
@abc.abstractmethod
def get_vendor_aggregates(self, reference):
""" list a all canonical names of vendors """
@abc.abstractmethod @abc.abstractmethod
def add_reset_token(self, token): def add_reset_token(self, token):
""" add an password reset token """ """ add an password reset token """
@ -190,14 +194,19 @@ class SqlAlchemyRepository(AbstractOrderRepository):
def search_vendor(self, reference): def search_vendor(self, reference):
""" search for a vendor by its canonical name """ """ search for a vendor by its canonical name """
vendor = ( return (
self.session.query(models.Vendor) self.session.query(models.Vendor)
.filter_by(term=reference) .filter_by(term=reference)
.one_or_none() .one_or_none()
) )
if vendor is None:
return None def get_vendor_aggregates(self, reference):
return vendor.name """ list a all canonical names of vendors """
vendors = self.session.query(models.Vendor).filter_by(name=reference).all()
if not vendors:
raise RepoItemNotFound
terms = sorted((v.term for v in vendors), key=lambda x:x.lower())
return models.VendorAggregate(vendors[0].name, terms)
def add_reset_token(self, token): def add_reset_token(self, token):
""" add an password reset token """ """ add an password reset token """

34
ordr3/resources.py

@ -82,7 +82,6 @@ class Order(BaseResource):
@classmethod @classmethod
def from_model(cls, model, parent): def from_model(cls, model, parent):
""" initializes a resource from an SQLalchemy object """
return cls(model.id, parent, model) return cls(model.id, parent, model)
@ -106,6 +105,37 @@ class OrderList(BaseResource):
raise KeyError from e raise KeyError from e
class Vendor(BaseResource):
def __acl__(self):
""" access controll list """
acl = [
(Allow, "role:admin", "view"),
(Allow, "role:admin", "edit"),
DENY_ALL,
]
return acl
@classmethod
def from_model(cls, model, parent):
""" initializes a resource from an model object """
print(model)
return cls(model.name, parent, model)
class VendorList(BaseResource):
def __acl__(self):
""" access controll list """
return [(Allow, "role:admin", "view"), DENY_ALL]
def __getitem__(self, key):
""" returns child resources """
try:
aggregagtes = self.request.repo.get_vendor_aggregates(key)
return Vendor.from_model(aggregagtes, self)
except StopIteration as e:
raise KeyError from e
class Root(BaseResource): class Root(BaseResource):
""" Root resource """ """ Root resource """
@ -115,6 +145,7 @@ class Root(BaseResource):
nodes = { nodes = {
"users": UserList, "users": UserList,
"orders": OrderList, "orders": OrderList,
"vendors": VendorList,
} }
def __init__(self, request): def __init__(self, request):
@ -131,6 +162,7 @@ class Root(BaseResource):
] ]
def includeme(config): def includeme(config):
""" """
Initialize the resources for traversal in a Pyramid app. Initialize the resources for traversal in a Pyramid app.

2
ordr3/services.py

@ -112,7 +112,7 @@ def check_vendor_name(repo, to_check):
if vendor is None: if vendor is None:
return CheckVendorResult(canonical_name, False) return CheckVendorResult(canonical_name, False)
else: else:
return CheckVendorResult(vendor, True) return CheckVendorResult(vendor.name, True)
def set_new_password(user, password, event_queue): def set_new_password(user, password, event_queue):

2
ordr3/templates/orders/list_content.jinja2

@ -32,7 +32,7 @@
{{ macros.status_label(order.model.status) }} {{ macros.status_label(order.model.status) }}
<div class="text-secondary small">&nbsp;</div> <div class="text-secondary small">&nbsp;</div>
</td> </td>
<td class="o3-actions"> <td class="o3-actions o3-dont-wrap"">
{% if request.has_permission("edit", order) %} {% if request.has_permission("edit", order) %}
<a href="{{ order|resource_url('edit') }}" title="Edit Order">{{ macros.icon("pencil")}}</a> <a href="{{ order|resource_url('edit') }}" title="Edit Order">{{ macros.icon("pencil")}}</a>
{% elif request.has_permission("view", order) %} {% elif request.has_permission("view", order) %}

22
ordr3/templates/vendors/list.jinja2 vendored

@ -0,0 +1,22 @@
{% extends "ordr3:templates/layout_full.jinja2" %}
{% block subtitle %} Manage Vendor Autocorrect {% endblock subtitle %}
{% block sidebar %}
{% endblock sidebar %}
{% block content %}
<div class="col-10">
<h4>Vendor Autocorrect List</h4>
<ul>
{% for vendor in vendors %}
<li><a href="{{ context|resource_url(vendor.name) }}">{{ vendor.name }}</a></li>
{% endfor %}
</ul>
</div>
{% endblock content %}

4
ordr3/views/root.py

@ -9,8 +9,8 @@ from pyramid.view import (
from pyramid.httpexceptions import HTTPFound from pyramid.httpexceptions import HTTPFound
@forbidden_view_config() #@forbidden_view_config()
@notfound_view_config() #@notfound_view_config()
@view_config( @view_config(
context="ordr3:resources.Root", permission="view", context="ordr3:resources.Root", permission="view",
) )

20
ordr3/views/vendors.py

@ -0,0 +1,20 @@
import deform
from sqlalchemy import func
from pyramid.csrf import get_csrf_token
from pyramid.view import view_config
from pyramid.httpexceptions import HTTPFound
from .. import events, models, services, resources
@view_config(
context="ordr3:resources.VendorList",
permission="view",
request_method="GET",
renderer="ordr3:templates/vendors/list.jinja2",
)
def vendor_list(context, request):
vendors = request.repo.session.query(models.Vendor.name).distinct(models.Vendor.name).order_by(func.lower(models.Vendor.name)).all()
return {"vendors":vendors}
Loading…
Cancel
Save