Elouan Le Bars
5 years ago
7 changed files with 0 additions and 431 deletions
-
1easy_my_coop_website_document/__init__.py
-
23easy_my_coop_website_document/__manifest__.py
-
1easy_my_coop_website_document/controllers/__init__.py
-
216easy_my_coop_website_document/controllers/main.py
-
11easy_my_coop_website_document/security/easy_my_coop_website_document_security.xml
-
1easy_my_coop_website_document/security/ir.model.access.csv
-
178easy_my_coop_website_document/views/easy_my_coop_website_document_templates.xml
@ -1 +0,0 @@ |
|||||
from . import controllers |
|
@ -1,23 +0,0 @@ |
|||||
# Copyright 2018-Coop IT Easy SCRLfs (<http://www.coopiteasy.be>) |
|
||||
# - Rémy Taymans <remy@coopiteasy.be> |
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
|
||||
|
|
||||
{ |
|
||||
"name": "Easy My Coop Website Document", |
|
||||
"version": "12.0.1.0.0", |
|
||||
"depends": ["website", "document_hosting",], |
|
||||
"author": "Coop IT Easy SCRLfs", |
|
||||
"license": "AGPL-3", |
|
||||
"category": "Cooperative Management", |
|
||||
"website": "www.coopiteasy.be", |
|
||||
"description": """ |
|
||||
Show documents in the website. |
|
||||
""", |
|
||||
"data": [ |
|
||||
"views/easy_my_coop_website_document_templates.xml", |
|
||||
"security/easy_my_coop_website_document_security.xml", |
|
||||
"security/ir.model.access.csv", |
|
||||
], |
|
||||
"installable": True, |
|
||||
"application": False, |
|
||||
} |
|
@ -1 +0,0 @@ |
|||||
from . import main |
|
@ -1,216 +0,0 @@ |
|||||
# Copyright 2018 Rémy Taymans <remytaymans@gmail.com> |
|
||||
# Copyright 2015-2016 Odoo S.A. |
|
||||
# Copyright 2016 Jairo Llopis <jairo.llopis@tecnativa.com> |
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
|
||||
|
|
||||
|
|
||||
import base64 |
|
||||
|
|
||||
from odoo import http |
|
||||
from odoo.http import request, Response |
|
||||
from odoo.fields import Date |
|
||||
|
|
||||
|
|
||||
class DocumentWebsite(http.Controller): |
|
||||
@http.route("/documents/<int:oid>", auth="public", website=True) |
|
||||
def get_document(self, oid=-1): |
|
||||
"""Render a http response for a document""" |
|
||||
document_mgr = request.env["document_hosting.document"] |
|
||||
doc = document_mgr.sudo().browse(oid) |
|
||||
ir_http_mgr = request.env["ir.http"] |
|
||||
status, headers, content = ir_http_mgr.sudo().binary_content( |
|
||||
model=doc._name, |
|
||||
id=oid, |
|
||||
field="document", |
|
||||
filename_field="filename", |
|
||||
download=True, |
|
||||
) |
|
||||
if status == 304: |
|
||||
return Response(status, headers) |
|
||||
elif status == 301: |
|
||||
# TODO: test this case not sure if this render the same |
|
||||
# return werkzeug.utils.redirect(content, code=301) |
|
||||
return request.redirect(content, code=301) |
|
||||
elif status != 200: |
|
||||
return request.not_found() |
|
||||
content_base64 = base64.b64decode(content) |
|
||||
headers.append(("Content-Length", len(content_base64))) |
|
||||
return request.make_response(content_base64, headers) |
|
||||
|
|
||||
@http.route("/documents", auth="public", website=True) |
|
||||
def template_website_document(self, date_begin=None, date_end=None, **kw): |
|
||||
""" |
|
||||
""" |
|
||||
values = {} |
|
||||
values.update( |
|
||||
self.website_document_side_bar( |
|
||||
date_begin=date_begin, |
|
||||
date_end=date_end, |
|
||||
user=request.env.user, |
|
||||
) |
|
||||
) |
|
||||
values.update( |
|
||||
self.display_categories_and_documents( |
|
||||
date_begin=date_begin, |
|
||||
date_end=date_end, |
|
||||
user=request.env.user, |
|
||||
) |
|
||||
) |
|
||||
values["size_to_str"] = self.size_to_str |
|
||||
return request.render( |
|
||||
"easy_my_coop_website_document.template_website_document", values, |
|
||||
) |
|
||||
|
|
||||
def website_document_side_bar( |
|
||||
self, date_begin=None, date_end=None, user=None |
|
||||
): |
|
||||
domains = [] |
|
||||
# Show only doc that are published |
|
||||
domains.append(("published", "=", True)) |
|
||||
# Show only authorized documents |
|
||||
if not self._is_authorized_user(user): |
|
||||
domains.append(("public", "=", True)) |
|
||||
# Show only doc in the time frame |
|
||||
if date_begin and date_end: |
|
||||
domains.append(("document_date", ">=", date_begin)) |
|
||||
domains.append(("document_date", "<", date_end)) |
|
||||
return { |
|
||||
"archive_groups": self._get_archive_groups( |
|
||||
"document_hosting.document", |
|
||||
domains, |
|
||||
fields=["name", "document_date"], |
|
||||
groupby="document_date", |
|
||||
order="document_date desc", |
|
||||
), |
|
||||
} |
|
||||
|
|
||||
def display_categories_and_documents( |
|
||||
self, date_begin=None, date_end=None, user=None |
|
||||
): |
|
||||
"""Prepare value for display_categories_and_documents template""" |
|
||||
data = self._data_tree() |
|
||||
# Show only doc that are published |
|
||||
data = self._data_filter_document(data, lambda r: r.published) |
|
||||
# Show only authorized documents |
|
||||
if not self._is_authorized_user(user): |
|
||||
data = self._data_filter_document(data, lambda r: r.public) |
|
||||
# Show only doc in the time frame |
|
||||
if date_begin and date_end: |
|
||||
data = self._data_filter_document( |
|
||||
data, |
|
||||
lambda r: ( |
|
||||
r.document_date >= date_begin |
|
||||
and r.document_date < date_end |
|
||||
), |
|
||||
) |
|
||||
# After all the filter, remove the empty categories |
|
||||
data = self._data_remove_empty_category(data) |
|
||||
return { |
|
||||
"category_tree": data, |
|
||||
} |
|
||||
|
|
||||
def size_to_str(self, size): |
|
||||
units = ["o", "ko", "Mo", "Go", "To"] |
|
||||
size_float = float(size) |
|
||||
for unit in units: |
|
||||
if size_float < 1000: |
|
||||
return "%.01f %s" % (size_float, unit) |
|
||||
size_float /= 1000 |
|
||||
|
|
||||
def _data_tree(self, category=None): |
|
||||
"""Return a tree with categories and documents in it""" |
|
||||
category_mgr = request.env["document_hosting.document.category"] |
|
||||
document_mgr = request.env["document_hosting.document"] |
|
||||
if category: |
|
||||
categories = category.child_ids.sorted(key=lambda r: r.name) |
|
||||
documents = category.document_ids |
|
||||
else: |
|
||||
categories = category_mgr.sudo().search( |
|
||||
[("parent_id", "=", False)], order="name" |
|
||||
) |
|
||||
documents = document_mgr.sudo().search([("category", "=", False)]) |
|
||||
if categories.ids: |
|
||||
tree = [] |
|
||||
for cat in categories: |
|
||||
tree.append(self._data_tree(cat)) |
|
||||
return (category, tree, documents) |
|
||||
else: |
|
||||
return (category, [], documents) |
|
||||
|
|
||||
def _data_filter_document(self, data, filter_fun): |
|
||||
category, child_data, documents = data |
|
||||
tree = [] |
|
||||
for entry in child_data: |
|
||||
tree.append(self._data_filter_document(entry, filter_fun)) |
|
||||
return (category, tree, documents.filtered(filter_fun)) |
|
||||
|
|
||||
def _data_remove_empty_category(self, data): |
|
||||
category, child_data, documents = data |
|
||||
child_data = [ |
|
||||
self._data_remove_empty_category(c) |
|
||||
for c in child_data |
|
||||
if not self._data_is_empty(c) |
|
||||
] |
|
||||
return (category, child_data, documents) |
|
||||
|
|
||||
def _data_is_empty(self, data): |
|
||||
"""Return True if data is empty""" |
|
||||
_, child_data, documents = data |
|
||||
# If there is documents, it's not empty. |
|
||||
if documents.ids: |
|
||||
return False |
|
||||
# We are sure there is no documents. |
|
||||
# If there is no child, it's empty. |
|
||||
if not child_data: |
|
||||
return True |
|
||||
# We are sure there is childs |
|
||||
for entry in child_data: |
|
||||
# If a child is not empty, it's not empty |
|
||||
if not self._data_is_empty(entry): |
|
||||
return False |
|
||||
# Else it's empty |
|
||||
return True |
|
||||
|
|
||||
def _is_authorized_user(self, user=None): |
|
||||
return user is not None and ( |
|
||||
user.has_group("base.group_portal") |
|
||||
or user.has_group("base.group_user") |
|
||||
) |
|
||||
|
|
||||
def _get_archive_groups( |
|
||||
self, |
|
||||
model, |
|
||||
domain=None, |
|
||||
fields=None, |
|
||||
groupby="create_date", |
|
||||
order="create_date desc", |
|
||||
): |
|
||||
if not model: |
|
||||
return [] |
|
||||
if domain is None: |
|
||||
domain = [] |
|
||||
if fields is None: |
|
||||
fields = ["name", "create_date"] |
|
||||
groups = [] |
|
||||
for group in ( |
|
||||
request.env[model] |
|
||||
.sudo() |
|
||||
.read_group(domain, fields=fields, groupby=groupby, orderby=order) |
|
||||
): |
|
||||
label = group[groupby] |
|
||||
date_begin = date_end = None |
|
||||
for leaf in group["__domain"]: |
|
||||
if leaf[0] == groupby: |
|
||||
if leaf[1] == ">=": |
|
||||
date_begin = leaf[2] |
|
||||
elif leaf[1] == "<": |
|
||||
date_end = leaf[2] |
|
||||
groups.append( |
|
||||
{ |
|
||||
"date_begin": Date.to_string(Date.from_string(date_begin)), |
|
||||
"date_end": Date.to_string(Date.from_string(date_end)), |
|
||||
"name": label, |
|
||||
"item_count": group[groupby + "_count"], |
|
||||
} |
|
||||
) |
|
||||
return groups |
|
@ -1,11 +0,0 @@ |
|||||
<?xml version="1.0" encoding="utf-8"?> |
|
||||
<!-- |
|
||||
Copyright 2015-2016 Odoo S.A. |
|
||||
Copyright 2018 Rémy Taymans <remytaymans@gmail.com> |
|
||||
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
|
||||
--> |
|
||||
<odoo> |
|
||||
<data noupdate="0"> |
|
||||
|
|
||||
</data> |
|
||||
</odoo> |
|
@ -1 +0,0 @@ |
|||||
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink |
|
@ -1,178 +0,0 @@ |
|||||
<?xml version="1.0" encoding="utf-8"?> |
|
||||
<!-- |
|
||||
Copyright 2018 Rémy Taymans <remytaymans@gmail.com> |
|
||||
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
|
||||
--> |
|
||||
<odoo> |
|
||||
|
|
||||
<!-- Add menu entries --> |
|
||||
<data noupdate="0"> |
|
||||
<record id="menu_website_document" model="website.menu"> |
|
||||
<field name="name">Documents</field> |
|
||||
<field name="url">/documents</field> |
|
||||
<field name="parent_id" ref="website.main_menu"/> |
|
||||
<field name="sequence" type="int">40</field> |
|
||||
</record> |
|
||||
</data> |
|
||||
|
|
||||
|
|
||||
<!-- Reusable template --> |
|
||||
<!-- Side bar --> |
|
||||
<template |
|
||||
id="website_document_side_bar" |
|
||||
name="Easy My Coop Website Document: Side bar"> |
|
||||
|
|
||||
<div class="oe_structure"/> |
|
||||
|
|
||||
<h3 class="page-header">Archives</h3> |
|
||||
<ul class="nav nav-pills nav-stacked"> |
|
||||
<t t-foreach="archive_groups" t-as="group"> |
|
||||
<t t-if="group['date_begin'] == date"> |
|
||||
<li class="active"> |
|
||||
<a t-att-href="default_url" t-ignore="True"> |
|
||||
<t t-esc="group['name']"/> |
|
||||
<span class="pull-right badge" t-esc="group['item_count']"/> |
|
||||
</a> |
|
||||
</li> |
|
||||
</t> |
|
||||
<t t-if="group['date_begin'] != date"> |
|
||||
<li> |
|
||||
<a t-ignore="True" |
|
||||
t-attf-href="#{default_url}?date_begin=#{group['date_begin']}&date_end=#{group['date_end']}"> |
|
||||
<t t-esc="group['name']"/> |
|
||||
<span class="pull-right badge" t-esc="group['item_count']"/> |
|
||||
</a> |
|
||||
</li> |
|
||||
</t> |
|
||||
</t> |
|
||||
</ul> |
|
||||
|
|
||||
<div class="oe_structure"/> |
|
||||
|
|
||||
</template> |
|
||||
|
|
||||
<!-- Display document list --> |
|
||||
<template |
|
||||
id="website_document_display_document_list" |
|
||||
name="Easy My Coop Website Document: Display document list"> |
|
||||
|
|
||||
<div class="list-group" t-foreach="documents" t-as="doc"> |
|
||||
<a t-attf-href="/documents/{{doc.id}}" |
|
||||
class="list-group-item clearfix"> |
|
||||
<span class="fa fa-file"></span> |
|
||||
<t t-esc="doc.name"/> - <small t-field="doc.document_date"/> |
|
||||
<span class="pull-right"> |
|
||||
<span class="fa fa-download"></span> |
|
||||
<t t-esc="size_to_str(doc.file_size)"/> |
|
||||
</span> |
|
||||
<t t-if="doc.description"> |
|
||||
<p t-field="doc.description" class="mb0 small"/> |
|
||||
</t> |
|
||||
</a> |
|
||||
</div> |
|
||||
|
|
||||
</template> |
|
||||
|
|
||||
<!-- Display of a category and its documents --> |
|
||||
<template |
|
||||
id="display_categories_and_documents" |
|
||||
name="Easy My Coop Website Document: Display Category and documents"> |
|
||||
|
|
||||
<t t-set="cat" t-value="category_tree[0]"/> |
|
||||
<t t-set="child_category_tree" t-value="category_tree[1]"/> |
|
||||
<t t-set="documents" t-value="category_tree[2]"/> |
|
||||
|
|
||||
<div class="panel panel-default" t-if="cat"> |
|
||||
<div class="panel-heading" role="tab" t-attf-id="heading-{{ cat.id }}"> |
|
||||
<a role="button" |
|
||||
class="h4" |
|
||||
t-attf-href="#collapse-{{ cat.id }}" |
|
||||
data-toggle="collapse" |
|
||||
aria-expanded="false" |
|
||||
t-attf-aria-controls="collapse-{{ cat.id }}"> |
|
||||
<h4 class="panel-title"> |
|
||||
<t t-esc="cat.name"/> |
|
||||
<t t-if="cat.description"> |
|
||||
<small> |
|
||||
- <t t-esc="cat.description"/> |
|
||||
</small> |
|
||||
</t> |
|
||||
</h4> |
|
||||
</a> |
|
||||
</div> |
|
||||
|
|
||||
<div t-attf-id="collapse-{{ cat.id }}" |
|
||||
class="panel-collapse collapse" |
|
||||
role="tabpanel" t-attf-aria-labelledby="heading-{{ cat.id }}"> |
|
||||
<div class="panel-body"> |
|
||||
|
|
||||
<t t-foreach="child_category_tree" t-as="child_cat_tree"> |
|
||||
<t t-call="easy_my_coop_website_document.display_categories_and_documents"> |
|
||||
<t t-set="category_tree" t-value="child_cat_tree"/> |
|
||||
</t> |
|
||||
</t> |
|
||||
|
|
||||
<t t-call="easy_my_coop_website_document.website_document_display_document_list"/> |
|
||||
|
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
|
|
||||
<t t-if="not cat"> |
|
||||
<t t-foreach="child_category_tree" t-as="child_cat_tree"> |
|
||||
<t t-call="easy_my_coop_website_document.display_categories_and_documents"> |
|
||||
<t t-set="category_tree" t-value="child_cat_tree"/> |
|
||||
</t> |
|
||||
</t> |
|
||||
<t t-call="easy_my_coop_website_document.website_document_display_document_list"/> |
|
||||
</t> |
|
||||
|
|
||||
</template> |
|
||||
|
|
||||
|
|
||||
<!-- Document main page --> |
|
||||
<template |
|
||||
id="template_website_document" |
|
||||
name="Easy My Coop Website Document: Main page" |
|
||||
page="True"> |
|
||||
<t t-call="website.layout"> |
|
||||
|
|
||||
<div class="oe_structure"/> |
|
||||
|
|
||||
<section class="wrap"> |
|
||||
<div class="container"> |
|
||||
<div class="row"> |
|
||||
<div class="col-md-12"> |
|
||||
<h1 class="text-center"> |
|
||||
Documents |
|
||||
</h1> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
</section> |
|
||||
|
|
||||
<div class="oe_structure"/> |
|
||||
|
|
||||
<section class="wrap"> |
|
||||
<div class="container"> |
|
||||
<div class="row"> |
|
||||
<!-- Main panel --> |
|
||||
<div class="col-xs-12 col-md-8"> |
|
||||
|
|
||||
<t t-call="easy_my_coop_website_document.display_categories_and_documents"/> |
|
||||
|
|
||||
</div> <!-- col-md-8 --> |
|
||||
|
|
||||
<!-- Side panel --> |
|
||||
<div class="col-xs-12 col-md-4"> |
|
||||
<t t-call="easy_my_coop_website_document.website_document_side_bar"/> |
|
||||
</div> <!-- col-md-4 --> |
|
||||
|
|
||||
</div> <!-- row --> |
|
||||
</div> <!-- container --> |
|
||||
</section> |
|
||||
|
|
||||
</t> |
|
||||
</template> |
|
||||
|
|
||||
</odoo> |
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue