├── README.md └── lia2_site ├── __init__.py ├── security └── ir.model.access.csv ├── static └── src │ └── css │ └── custom.css ├── __openerp__.py ├── lia2_site.py ├── controller.py └── lia2_site_view.xml /README.md: -------------------------------------------------------------------------------- 1 | # lia2-site 2 | -------------------------------------------------------------------------------- /lia2_site/__init__.py: -------------------------------------------------------------------------------- 1 | import controller 2 | import lia2_site -------------------------------------------------------------------------------- /lia2_site/security/ir.model.access.csv: -------------------------------------------------------------------------------- 1 | id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink 2 | lia_portal_rights, Lia2 Portal, model_portal_token, base.group_website_designer,1,1,1,1 -------------------------------------------------------------------------------- /lia2_site/static/src/css/custom.css: -------------------------------------------------------------------------------- 1 | #wrapper { 2 | padding-bottom: 50px; 3 | } 4 | .projects_container { 5 | padding-bottom: 20px; 6 | } 7 | 8 | .users_container { 9 | padding-bottom: 20px; 10 | border-left: 1px solid #e5e5e5; 11 | } 12 | 13 | .list { 14 | padding-left: 20px; 15 | } 16 | 17 | .question { 18 | border: 1px solid #e5e5e5; 19 | border-radius: 25px; 20 | padding: 20px; 21 | margin-bottom: 10px; 22 | margin-right: 40px; 23 | margin-top: 35px; 24 | } 25 | 26 | .questions_container { 27 | border-right: 2px solid #e5e5e5; 28 | } 29 | .sprint_list, .task_list, .user_list, .project_list, .contributed_list, .meeting_list_employee { 30 | border: 1px solid #e5e5e5; 31 | border-radius: 25px; 32 | padding: 20px; 33 | margin-bottom: 10px; 34 | } 35 | 36 | ul { 37 | list-style-type: none; 38 | padding: 0; 39 | margin: 0; 40 | } 41 | 42 | 43 | -------------------------------------------------------------------------------- /lia2_site/__openerp__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ############################################################################## 3 | # 4 | # OpenERP, Open Source Management Solution, third party addon 5 | # Copyright (C) 2004-2015 Vertel AB (). 6 | # 7 | # This program is free software: you can redistribute it and/or modify 8 | # it under the terms of the GNU Affero General Public License as 9 | # published by the Free Software Foundation, either version 3 of the 10 | # License, or (at your option) any later version. 11 | # 12 | # This program is distributed in the hope that it will be useful, 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | # GNU Affero General Public License for more details. 16 | # 17 | # You should have received a copy of the GNU Affero General Public License 18 | # along with this program. If not, see . 19 | # 20 | ############################################################################## 21 | 22 | 23 | { 24 | 'name': 'LIA Site', 25 | 'version': '1.0', 26 | 'category': 'other', 27 | 'description': "", 28 | 'author': 'Vertel AB', 29 | 'website': 'http://www.vertel.se', 30 | 'depends': ['base', 'project_scrum', 'project_timesheet', 'website'], 31 | 'data': ['lia2_site_view.xml'], 32 | 'installable': True, 33 | 34 | } 35 | # vim:expandtab:smartindent:tabstop=4s:softtabstop=4:shiftwidth=4: 36 | -------------------------------------------------------------------------------- /lia2_site/lia2_site.py: -------------------------------------------------------------------------------- 1 | ############################################################################## 2 | # 3 | # OpenERP, Open Source Management Solution, third party addon 4 | # Copyright (C) 2004-2015 Vertel AB (). 5 | # 6 | # This program is free software: you can redistribute it and/or modify 7 | # it under the terms of the GNU Affero General Public License as 8 | # published by the Free Software Foundation, either version 3 of the 9 | # License, or (at your option) any later version. 10 | # 11 | # This program is distributed in the hope that it will be useful, 12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | # GNU Affero General Public License for more details. 15 | # 16 | # You should have received a copy of the GNU Affero General Public License 17 | # along with this program. If not, see . 18 | # 19 | ############################################################################## 20 | 21 | from openerp import models, api, _, fields 22 | import random 23 | import logging 24 | _logger = logging.getLogger(__name__) 25 | 26 | class project_project(models.Model): 27 | _inherit = "project.project" 28 | 29 | publish_in_portal = fields.Boolean(string="Publish In Portal") 30 | 31 | class user_portal(models.Model): 32 | _inherit = "hr.employee" 33 | 34 | publish_in_portal = fields.Boolean(string="Publish In Portal") 35 | website_description = fields.Html(string="HTML Description", sanitize=False) 36 | 37 | 38 | class project_token(models.Model): 39 | _name = "portal.token" 40 | _inherit = ['mail.thread', 'ir.needaction_mixin'] 41 | 42 | def generate_token(self): 43 | token = "" 44 | alphabet = "1234567890QWERTYUIOPASDFGHJKLZXCVBNM" 45 | for letter in range(10): 46 | token += alphabet[random.randrange(len(alphabet))] 47 | return token 48 | 49 | def generate_link(self): 50 | base_url = self.env["ir.config_parameter"].sudo().get_param("web.base.url") 51 | return base_url+"/lia-portal/"+self.token 52 | 53 | partner_id = fields.Many2one(comodel_name="res.partner", string="Partner") 54 | token = fields.Char(string="Token", default=generate_token) 55 | 56 | class res_partner(models.Model): 57 | _inherit = "res.partner" 58 | 59 | token_id = fields.Many2one(comodel_name="portal.token", string="Token") 60 | 61 | @api.multi 62 | def send_invite_link(self): 63 | 64 | assert len(self) == 1, 'This option should only be used for a single id at a time.' 65 | 66 | self.token_id = self.env["portal.token"].create({}) 67 | 68 | template = self.env.ref('lia2_site.email_template_id', False) 69 | compose_form = self.env.ref('mail.email_compose_message_wizard_form', False) 70 | 71 | ctx = { 72 | "default_model" : "res.partner", 73 | "default_res_id" : self.id, 74 | "default_use_template" : bool(template), 75 | "default_template_id" : template.id, 76 | "default_composition_mode" : "comment" 77 | } 78 | self.state = "sent" 79 | return { 80 | "name" : _("Compose Email"), 81 | "type" : "ir.actions.act_window", 82 | "view_type" : "form", 83 | "view_mode" : "form", 84 | "res_model" : "mail.compose.message", 85 | "views" : [(compose_form.id, "form")], 86 | "view_id" : compose_form.id, 87 | "target" : "new", 88 | "context" : ctx 89 | } 90 | 91 | 92 | -------------------------------------------------------------------------------- /lia2_site/controller.py: -------------------------------------------------------------------------------- 1 | ############################################################################## 2 | # 3 | # OpenERP, Open Source Management Solution, third party addon 4 | # Copyright (C) 2004-2015 Vertel AB (). 5 | # 6 | # This program is free software: you can redistribute it and/or modify 7 | # it under the terms of the GNU Affero General Public License as 8 | # published by the Free Software Foundation, either version 3 of the 9 | # License, or (at your option) any later version. 10 | # 11 | # This program is distributed in the hope that it will be useful, 12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | # GNU Affero General Public License for more details. 15 | # 16 | # You should have received a copy of the GNU Affero General Public License 17 | # along with this program. If not, see . 18 | # 19 | ############################################################################## 20 | 21 | from openerp import models, fields, api, _ 22 | from openerp import http 23 | from openerp.http import request 24 | 25 | class lia2_site(http.Controller): 26 | 27 | def check_token(self, token, request): 28 | token_from_db = request.env["portal.token"].sudo().search([("token", "=", token)]) 29 | 30 | return len(token_from_db) > 0 31 | 32 | @http.route("/lia-portal/", type="http", auth="public", website=True) 33 | def portal(self, token=False, **post): 34 | 35 | if self.check_token(token, request): 36 | context = { 37 | "employees" : request.env["hr.employee"].sudo().search([("publish_in_portal", "=", True)]), 38 | "projects" : request.env["project.project"].sudo().search([("publish_in_portal", "=", True)]), 39 | "token" : token 40 | } 41 | return request.render("lia2_site.main_template", context) 42 | else: 43 | return request.render("lia2_site.unauthorized_template", None) 44 | 45 | 46 | @http.route("/lia-portal//project/", type="http", auth="public", website=True) 47 | def view_project(self, project_id=None, token=None, **post): 48 | 49 | if self.check_token(token, request): 50 | context = { 51 | "project" : request.env["project.project"].sudo().browse(project_id), 52 | "token" : token 53 | } 54 | return request.render("lia2_site.project_template", context) 55 | else: 56 | return request.render("lia2_site.unauthorized_template", None) 57 | 58 | 59 | @http.route("/lia-portal//sprint/", type="http", auth="public", website=True) 60 | def view_sprint(self, sprint_id=None, token=None, **post): 61 | if self.check_token(token, request): 62 | sprint = request.env["project.scrum.sprint"].sudo().browse(sprint_id) 63 | 64 | context = { 65 | "sprint" : sprint, 66 | "token" : token 67 | } 68 | return request.render("lia2_site.sprint_template", context) 69 | else: 70 | return request.render("lia2_site.unauthorized_template", None) 71 | 72 | 73 | @http.route("/lia-portal//employee/", type="http", auth="public", website=True) 74 | def view_employee(self, employee_id=None, token=None, **post): 75 | 76 | if self.check_token(token, request): 77 | employee = request.env["hr.employee"].sudo().browse(employee_id) 78 | 79 | context = { 80 | "meetings" : request.env["project.scrum.meeting"].sudo().search([("user_id_meeting", "=", employee.user_id.id)], order="date_meeting desc"), 81 | "projects" : request.env["project.project"].sudo().search([("members.id", "=", employee.user_id.id)]), 82 | "employee" : employee, 83 | "token" : token 84 | } 85 | return request.render("lia2_site.employee_template", context) 86 | else: 87 | return request.render("lia2_site.unauthorized_template", None) 88 | 89 | @http.route("/lia-portal//employee//meeting/", type="http", auth="public", website=True) 90 | def view_meetings(self, meeting_id=None, employee_id=None, token=None, **post): 91 | 92 | if self.check_token(token, request): 93 | meeting = request.env["project.scrum.meeting"].sudo().browse(meeting_id) 94 | employee = request.env["hr.employee"].sudo().browse(employee_id) 95 | 96 | context = { 97 | "meetings" : request.env["project.scrum.meeting"].sudo().search([("user_id_meeting", "=", employee.user_id.id)], order="date_meeting desc"), 98 | "meeting" : meeting, 99 | "employee" : employee, 100 | "token" : token 101 | } 102 | return request.render("lia2_site.meeting_template", context) 103 | else: 104 | return request.render("lia2_site.unauthorized_template", None) -------------------------------------------------------------------------------- /lia2_site/lia2_site_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | project.lia2.portal.view 8 | project.project 9 | 10 | 11 | 12 | 19 | 20 | 21 | employee.lia2.portal.view 22 | hr.employee 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | lia2.partner.view 35 | res.partner 36 | 37 | 38 | 39 | 40 |