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

17
ordr3/repo.py

@ -64,6 +64,10 @@ class AbstractOrderRepository(abc.ABC): @@ -64,6 +64,10 @@ class AbstractOrderRepository(abc.ABC):
def search_vendor(self, reference):
""" 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
def add_reset_token(self, token):
""" add an password reset token """
@ -190,14 +194,19 @@ class SqlAlchemyRepository(AbstractOrderRepository): @@ -190,14 +194,19 @@ class SqlAlchemyRepository(AbstractOrderRepository):
def search_vendor(self, reference):
""" search for a vendor by its canonical name """
vendor = (
return (
self.session.query(models.Vendor)
.filter_by(term=reference)
.one_or_none()
)
if vendor is None:
return None
return vendor.name
def get_vendor_aggregates(self, reference):
""" 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):
""" add an password reset token """

34
ordr3/resources.py

@ -82,7 +82,6 @@ class Order(BaseResource): @@ -82,7 +82,6 @@ class Order(BaseResource):
@classmethod
def from_model(cls, model, parent):
""" initializes a resource from an SQLalchemy object """
return cls(model.id, parent, model)
@ -106,6 +105,37 @@ class OrderList(BaseResource): @@ -106,6 +105,37 @@ class OrderList(BaseResource):
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):
""" Root resource """
@ -115,6 +145,7 @@ class Root(BaseResource): @@ -115,6 +145,7 @@ class Root(BaseResource):
nodes = {
"users": UserList,
"orders": OrderList,
"vendors": VendorList,
}
def __init__(self, request):
@ -131,6 +162,7 @@ class Root(BaseResource): @@ -131,6 +162,7 @@ class Root(BaseResource):
]
def includeme(config):
"""
Initialize the resources for traversal in a Pyramid app.

2
ordr3/services.py

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

2
ordr3/templates/orders/list_content.jinja2

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

22
ordr3/templates/vendors/list.jinja2 vendored

@ -0,0 +1,22 @@ @@ -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 ( @@ -9,8 +9,8 @@ from pyramid.view import (
from pyramid.httpexceptions import HTTPFound
@forbidden_view_config()
@notfound_view_config()
#@forbidden_view_config()
#@notfound_view_config()
@view_config(
context="ordr3:resources.Root", permission="view",
)

20
ordr3/views/vendors.py

@ -0,0 +1,20 @@ @@ -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