Browse Source

[ADD] website_shift: Personal page for working information (#33)

* [ADD] website_shift: Add configuration

irregular_shift_limit: Maximum shift that will be shown
highlight_rule: Treshold of available space in a shift that trigger the
                highlight of the shift
hide_rule: Treshold ((available space)/(max space)) in percentage of
           available space under wich the shift is hidden
The last one replaces the old hide filter.

* [FIX] website_shift: Wrong mail on regular shift

Fix the wrong email address that is shown on the public page that show
available shift for irregular worker.

* [ADD] website_shift: Irregular personal work page

Add personal shift page for irregular worker that allows you to
subscribe to a shift.

* [ADD] website_shift: Personal page for non-worker

Add a personal page for non-worker that shows a simple message telling
them that they don't have to do a shift.

* [ADD] website_shift: Regular personal work page

Add personal shift page for regular worker.

* [ADD] website_shift: Exempted personal work page

Add personal shift page for exempted worker.

* [IMP] website_shift: Shopping status personal page

This add a label that shows the shopping status of a user.
If the label is green the user can shop.
If the label is red the user cannot shop.
There is also icons for disambiguation.

* [ADD] website_shift: Config en & dis shift sign up

This add a configuration boolean that enable or disable the shift sign
up for irregular worker.

* [IMP] website_shift: Status on personal pages

Show dates properly.
Hide what's useless.
Give meaningful name.

* [IMP] website_shift: Design of personal pages

* Lower size of h2 title.
* Add top margin to h1.
* Change highlight color.
* Change position of explanation test.

* [IMP] website_shift: Refactor templates

Refactor templates to avoid dupplicate code.
Refactor the controller to match with new templates.
Add license.

* [ADD] website_shift: Past shifts on personal page

Add a list of the previous shifts for a worker.

* [ADD] website_shift: Super Coop info

Add a button to show email and phone of the super cooperator of a shift.
Tell you if you are a Super Co-operator

* [IMP] website_shift: Next shifts regular worker

Add configuration to specify how many next shifts for regular worker
must be shown to them on their personal web page. This config is called
`regular_next_shift_limit`.

Improve the view that shows the next shifts on the personal page for a
regular worker regarding to the `regular_next_shift_limit`.

Because all the next shifts are not created in the database, we need to
create 'fictive' one that are not stored.

* [ADD] website_shift: Warning about holidays

Add a warning message on the personal page for a regular worker that
tells that public holidays are not taken into account for the moment.

* [IMP] website_theme: colors for warnings

* [FIX] website_shift: 403 when subscribing

Fix the case when an irregular worker that doesn't have write access to
beesdoo.shift.shift try to subscribe to a shift and got a 403 error.

* [FIX] website_theme: Theme must be an application

As wrote in this document :
https://www.odoo.com/documentation/9.0/howtos/themes.html#create-a-theme-module
a theme module must be an application.

* [FIX] webs_shift: Wrong display of date last shift

Fix the case when an irregular worker is in alert and that the date
before last shift is displayed.

The `date_before_last_shift` is renamed in `future_alert_start_time`.
This name better represent what this variable contains. It also explains
why this information does not have to be displayed when the worker is
already in alert mode as this date is the date in the future on which
the worker will be in alert.

* [FIX] website_shift: Co-operator -> Cooperator

* [FIX] website_shift: Past shifts not ordered desc

The past shift was not properly ordered. This fix by ordering the past
shifts from the newest to the oldest.

* [FIX] website_shift: Holiday shown after end of it

Before:
    The holiday is shown even if the holiday is in the past.
After:
    The holiday is shown only if the holiday is now or in the future.
pull/128/head
Rémy Taymans 7 years ago
parent
commit
b7a15cbe5d
  1. 1
      beesdoo_website_shift/__init__.py
  2. 12
      beesdoo_website_shift/__openerp__.py
  3. 447
      beesdoo_website_shift/controllers/main.py
  4. 37
      beesdoo_website_shift/data/res_config_data.xml
  5. 2
      beesdoo_website_shift/i18n/fr_BE.po
  6. 1
      beesdoo_website_shift/models/__init__.py
  7. 103
      beesdoo_website_shift/models/res_config.py
  8. 685
      beesdoo_website_shift/views/my_shift_website_templates.xml
  9. 100
      beesdoo_website_shift/views/res_config_views.xml
  10. 228
      beesdoo_website_shift/views/shift_website_templates.xml

1
beesdoo_website_shift/__init__.py

@ -1 +1,2 @@
from . import controllers from . import controllers
from . import models

12
beesdoo_website_shift/__openerp__.py

@ -1,6 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright 2017-2018 Rémy Taymans <remytaymans@gmail.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{ {
'name': 'Beescoop Shift Website',
'name': 'BEES coop Shift Website',
'summary': """ 'summary': """
Show available shifts for regular and irregular workers in Show available shifts for regular and irregular workers in
@ -10,14 +14,18 @@
""", """,
'author': 'Rémy Taymans', 'author': 'Rémy Taymans',
'license': 'AGPL-3',
'version': '9.0.1.0',
'website': "https://github.com/beescoop/Obeesdoo", 'website': "https://github.com/beescoop/Obeesdoo",
'category': 'Cooperative management', 'category': 'Cooperative management',
'version': '0.1',
'depends': ['website', 'beesdoo_shift'], 'depends': ['website', 'beesdoo_shift'],
'data': [ 'data': [
'data/res_config_data.xml',
'views/shift_website_templates.xml', 'views/shift_website_templates.xml',
'views/my_shift_website_templates.xml',
'views/res_config_views.xml',
] ]
} }

447
beesdoo_website_shift/controllers/main.py

@ -1,56 +1,437 @@
# -*- coding: utf8 -*- # -*- coding: utf8 -*-
from datetime import datetime
# Copyright 2017-2018 Rémy Taymans <remytaymans@gmail.com>
# Copyright 2017-2018 Thibault François
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from ast import literal_eval
from copy import copy
from datetime import datetime, timedelta
from itertools import groupby from itertools import groupby
from openerp import http
from openerp import http, fields
from openerp.http import request from openerp.http import request
from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT as DATETIME_FORMAT
from openerp.addons.beesdoo_shift.models.planning import float_to_time from openerp.addons.beesdoo_shift.models.planning import float_to_time
class ShiftPortalController(http.Controller):
PERIOD = 28 # TODO: use the same constant as in 'beesdoo_shift'
class WebsiteShiftController(http.Controller):
def is_user_irregular(self):
user = request.env['res.users'].browse(request.uid)
working_mode = user.partner_id.working_mode
return working_mode == 'irregular'
def is_user_regular(self):
user = request.env['res.users'].browse(request.uid)
working_mode = user.partner_id.working_mode
return working_mode == 'regular'
def is_user_exempted(self):
user = request.env['res.users'].browse(request.uid)
working_mode = user.partner_id.working_mode
return working_mode == 'exempt'
@http.route('/my/shift', auth='user', website=True)
def my_shift(self, **kw):
"""
Personal page for managing your shifts
"""
if self.is_user_irregular():
return request.render(
'beesdoo_website_shift.my_shift_irregular_worker',
self.my_shift_irregular_worker(nexturl='/my/shift')
)
if self.is_user_regular():
return request.render(
'beesdoo_website_shift.my_shift_regular_worker',
self.my_shift_regular_worker()
)
if self.is_user_exempted():
return request.render(
'beesdoo_website_shift.my_shift_exempted_worker',
self.my_shift_exempted_worker()
)
return request.render(
'beesdoo_website_shift.my_shift_non_worker',
{}
)
@http.route('/shift/<int:shift_id>/subscribe', auth='user', website=True)
def subscribe_to_shift(self, shift_id=-1, **kw):
"""
Subscribe the current connected user into the given shift
This is done only if :
* shift sign up is authorised via configuration panel
* the current connected user is an irregular worker
* the given shift exist
* the shift is free for subscription
"""
# Get current user
cur_user = request.env['res.users'].browse(request.uid)
# Get the shift
shift = request.env['beesdoo.shift.shift'].sudo().browse(shift_id)
# Get config
irregular_enable_sign_up = literal_eval(request.env['ir.config_parameter'].get_param(
'beesdoo_website_shift.irregular_enable_sign_up'))
if (irregular_enable_sign_up
and cur_user.partner_id.working_mode == 'irregular'
and shift
and not shift.worker_id):
shift.worker_id = cur_user.partner_id
return request.redirect(kw['nexturl'])
@http.route('/shift_irregular_worker', auth='public', website=True) @http.route('/shift_irregular_worker', auth='public', website=True)
def shift_irregular_worker(self, **kwargs):
# Get all the shifts in the future with no worker
now = datetime.now()
shifts = request.env['beesdoo.shift.shift'].sudo().search(
[('start_time', '>', now.strftime("%Y-%m-%d %H:%M:%S")),
('worker_id', '=', False)],
order="start_time, task_template_id, task_type_id",
def public_shift_irregular_worker(self, **kw):
"""
Show a public access page that show all the available shifts for irregular worker.
"""
nexturl = '/shift_irregular_worker'
irregular_enable_sign_up = False
# Create template context
template_context = {}
template_context.update(self.available_shift_irregular_worker(
irregular_enable_sign_up, nexturl
))
return request.render(
'beesdoo_website_shift.public_shift_irregular_worker',
template_context
) )
# Grouby task_template_id, if no task_template_id is specified
# then group by start_time
groupby_func = lambda s: (s.task_template_id, s.start_time, s.task_type_id)
groupby_iter = groupby(shifts, groupby_func)
@http.route('/shift_template_regular_worker', auth='public', website=True)
def public_shift_template_regular_worker(self, **kw):
"""
Show a public access page that show all the available shift templates for regular worker.
"""
# Get all the task template
template = request.env['beesdoo.shift.template']
task_templates = template.sudo().search([], order="planning_id, day_nb_id, start_time")
shifts_and_count = []
for (keys, grouped_shifts) in groupby_iter:
(task_template, _, _) = keys
s = list(grouped_shifts)
free_space = len(s)
# Among shifts with at least 5 worker max, shows only shifts
# where there is at least two free spaces
if task_template.worker_nb > 5 and free_space >= 2:
shifts_and_count.append([free_space, s[0]])
# Show available shifts if there is less than 5 worker max
if task_template.worker_nb <= 5:
shifts_and_count.append([free_space, s[0]])
return request.render('beesdoo_website_shift.shift_template',
return request.render(
'beesdoo_website_shift.public_shift_template_regular_worker',
{ {
'shift_templates': shifts_and_count
'task_templates': task_templates,
'float_to_time': float_to_time,
} }
) )
@http.route('/shift_template_regular_worker', auth='public', website=True)
def shift_template_regular_worker(self, **kwargs):
def my_shift_irregular_worker(self, nexturl=""):
"""
Return template variables for 'beesdoo_website_shift.my_shift_irregular_worker' template
"""
# Get current user
cur_user = request.env['res.users'].browse(request.uid)
cur_cooperative_status = cur_user.partner_id.cooperative_status_ids
# Get config
irregular_enable_sign_up = literal_eval(request.env['ir.config_parameter'].get_param(
'beesdoo_website_shift.irregular_enable_sign_up'))
# Create template context
template_context = {}
template_context.update(self.my_shift_worker_status())
template_context.update(self.my_shift_next_shifts())
template_context.update(self.my_shift_past_shifts())
template_context.update(self.available_shift_irregular_worker(
irregular_enable_sign_up, nexturl
))
future_alert_date = False
if not cur_cooperative_status.alert_start_time:
# Compute date before which the worker is up to date
today_date = fields.Date.from_string(cur_cooperative_status.today)
delta = (today_date - fields.Date.from_string(cur_cooperative_status.irregular_start_date)).days
future_alert_date = today_date + timedelta(days=(cur_cooperative_status.sr + 1) * PERIOD - delta % PERIOD)
future_alert_date = future_alert_date.strftime('%Y-%m-%d')
template_context.update(
{
'future_alert_date': future_alert_date,
}
)
return template_context
def my_shift_regular_worker(self):
"""
Return template variables for 'beesdoo_website_shift.my_shift_regular_worker' template
"""
# Create template context
template_context = {}
# Get all the task template # Get all the task template
template = request.env['beesdoo.shift.template'] template = request.env['beesdoo.shift.template']
task_templates = template.sudo().search([], order="planning_id, day_nb_id, start_time") task_templates = template.sudo().search([], order="planning_id, day_nb_id, start_time")
return request.render('beesdoo_website_shift.task_template',
template_context.update(self.my_shift_worker_status())
template_context.update(self.my_shift_next_shifts())
template_context.update(self.my_shift_past_shifts())
template_context.update(
{ {
'task_templates': task_templates, 'task_templates': task_templates,
'float_to_time': float_to_time
'float_to_time': float_to_time,
} }
) )
return template_context
def my_shift_exempted_worker(self):
"""
Return template variables for 'beesdoo_website_shift.my_shift_exempted_worker' template
"""
return self.my_shift_worker_status()
def available_shift_irregular_worker(self, irregular_enable_sign_up=False, nexturl=""):
"""
Return template variables for 'beesdoo_website_shift.available_shift_irregular_worker' template
"""
# Get current user
cur_user = request.env['res.users'].browse(request.uid)
# Get all the shifts in the future with no worker
now = datetime.now()
shifts = request.env['beesdoo.shift.shift'].sudo().search(
[('start_time', '>', now.strftime("%Y-%m-%d %H:%M:%S")),
('worker_id', '=', False)],
order="start_time, task_template_id, task_type_id",
)
# Get shifts where user is subscribed
subscribed_shifts = request.env['beesdoo.shift.shift'].sudo().search(
[('start_time', '>', now.strftime("%Y-%m-%d %H:%M:%S")),
('worker_id', '=', cur_user.partner_id.id)],
order="start_time, task_template_id, task_type_id",
)
# Get config
irregular_shift_limit = int(request.env['ir.config_parameter'].get_param(
'beesdoo_website_shift.irregular_shift_limit'))
highlight_rule = int(request.env['ir.config_parameter'].get_param(
'beesdoo_website_shift.highlight_rule'))
hide_rule = int(request.env['ir.config_parameter'].get_param(
'beesdoo_website_shift.hide_rule')) / 100.0
# Grouby task_template_id, if no task_template_id is specified
# then group by start_time, if no start_time specified sort by
# task_type
groupby_iter = groupby(
shifts,
lambda s: (s.task_template_id, s.start_time, s.task_type_id)
)
shifts_count_subscribed = []
nb_displayed_shift = 0 # Number of shift displayed
for (keys, grouped_shifts) in groupby_iter:
(task_template, start_time, task_type) = keys
nb_displayed_shift = nb_displayed_shift + 1
shift_list = list(grouped_shifts)
# Compute available space
free_space = len(shift_list)
# Is the current user subscribed to this task_template
is_subscribed = any(
(sub_shift.task_template_id == task_template and
sub_shift.start_time == start_time and
sub_shift.task_type_id == task_type)
for sub_shift in subscribed_shifts)
if free_space >= task_template.worker_nb * hide_rule:
shifts_count_subscribed.append([shift_list[0], free_space, is_subscribed])
# Stop showing shifts if the limit is reached
if irregular_shift_limit > 0 and nb_displayed_shift >= irregular_shift_limit:
break
return {
'shift_templates': shifts_count_subscribed,
'highlight_rule': highlight_rule,
'nexturl': nexturl,
'irregular_enable_sign_up': irregular_enable_sign_up,
}
def my_shift_next_shifts(self):
"""
Return template variables for 'beesdoo_website_shift.my_shift_next_shifts' template
"""
# Get current user
cur_user = request.env['res.users'].browse(request.uid)
# Get shifts where user is subscribed
now = datetime.now()
subscribed_shifts_rec = request.env['beesdoo.shift.shift'].sudo().search(
[('start_time', '>', now.strftime("%Y-%m-%d %H:%M:%S")),
('worker_id', '=', cur_user.partner_id.id)],
order="start_time, task_template_id, task_type_id",
)
# We don't use record to show the next shift as we need to add
# fictive one for regular worker. I say 'fictive' one because
# the next shifts for the regular worker are generated on a
# PERIOD basis and database doesn't contain more than a PERIOD
# of shift. So a regular worker will always see only one
# next shift, the one that is generated and stored in the
# database. Meaning that if we want to show the next shifts
# for an entire year, we need to compute the dates for the next
# shifts and create it. But we want to keep it 'fictive',
# meaning that we don't want to write them in the database.
# So here we convert recordset into Shift object.
subscribed_shifts = []
for shift_rec in subscribed_shifts_rec:
shift = Shift(shift_rec)
subscribed_shifts.append(shift)
# We want to keep a copy of the shift that will serve as a
# master to create the fictive shifts.
if shift_rec.worker_id in shift_rec.task_template_id.worker_ids:
main_shift = shift
main_shift_rec = shift_rec
# In case of regular worker, we compute his fictive next shifts
# according to the regular_next_shift_limit
if self.is_user_regular() and subscribed_shifts and main_shift:
# Get config
regular_next_shift_limit = int(request.env['ir.config_parameter'].get_param(
'beesdoo_website_shift.regular_next_shift_limit'))
for i in range(1, regular_next_shift_limit):
# Compute the new date for the created shift
start_time = fields.Datetime.from_string(main_shift_rec.start_time)
start_time = (start_time + timedelta(days=i*PERIOD)).strftime(DATETIME_FORMAT)
# Create the fictive shift
shift = copy(main_shift)
shift.id = -i # We give negative id 'caus this shift doesn't exist in database
shift.start_day = start_time
shift.start_date = start_time
subscribed_shifts.append(shift)
return {
'is_regular': self.is_user_regular(),
'subscribed_shifts': subscribed_shifts,
}
def my_shift_past_shifts(self):
"""
Return template variables for 'beesdoo_website_shift.my_shift_past_shifts' template
"""
# Get current user
cur_user = request.env['res.users'].browse(request.uid)
# Get config
past_shift_limit = 0
if self.is_user_irregular():
past_shift_limit = int(request.env['ir.config_parameter'].get_param(
'beesdoo_website_shift.irregular_past_shift_limit'))
if self.is_user_regular():
past_shift_limit = int(request.env['ir.config_parameter'].get_param(
'beesdoo_website_shift.regular_past_shift_limit'))
# Get shifts where user was subscribed
now = datetime.now()
if past_shift_limit > 0:
past_shifts = request.env['beesdoo.shift.shift'].sudo().search(
[('start_time', '<=', now.strftime("%Y-%m-%d %H:%M:%S")),
('worker_id', '=', cur_user.partner_id.id)],
order="start_time desc, task_template_id, task_type_id",
limit=past_shift_limit,
)
else:
past_shifts = request.env['beesdoo.shift.shift'].sudo().search(
[('start_time', '<=', now.strftime("%Y-%m-%d %H:%M:%S")),
('worker_id', '=', cur_user.partner_id.id)],
order="start_time desc, task_template_id, task_type_id",
)
return {
'past_shifts': past_shifts,
}
def my_shift_worker_status(self):
"""
Return template variables for 'beesdoo_website_shift.my_shift_worker_status_*' template
"""
cur_user = request.env['res.users'].browse(request.uid)
return {
'status': cur_user.partner_id.cooperative_status_ids,
}
class Shift(object):
"""
Represent a shift with all useful information in a format that is directly printable in a template
"""
def __init__(self, shift_rec=None):
self.id = 0
self._start_day = ''
self._start_date = ''
self._start_time = ''
self._end_time = ''
self.task_type_name = ''
self.super_coop_name = ''
self.super_coop_phone = ''
self.super_coop_email = ''
if shift_rec:
self.update(shift_rec)
def update(self, shift_rec=None):
""" Fill in self with data in the given record"""
if shift_rec:
self.id = shift_rec.id
self.start_day = shift_rec.start_time
self.start_date = shift_rec.start_time
self.start_time = shift_rec.start_time
self.end_time = shift_rec.end_time
if shift_rec.task_type_id:
self.task_type_name = shift_rec.task_type_id.name
if shift_rec.super_coop_id:
self.super_coop_name = shift_rec.super_coop_id.name
self.super_coop_phone = shift_rec.super_coop_id.phone
self.super_coop_email = shift_rec.super_coop_id.email
# Properties
@property
def start_day(self):
return self._start_day
@property
def start_date(self):
return self._start_date
@property
def start_time(self):
return self._start_time
@property
def end_time(self):
return self._end_time
# Setters
@start_day.setter
def start_day(self, datetime_str):
self._start_day = datetime.strptime(datetime_str, DATETIME_FORMAT).strftime('%A')
@start_date.setter
def start_date(self, datetime_str):
self._start_date = datetime.strptime(datetime_str, DATETIME_FORMAT).strftime('%d %B %Y')
@start_time.setter
def start_time(self, datetime_str):
self._start_time = datetime.strptime(datetime_str, DATETIME_FORMAT).strftime('%H:%M')
@end_time.setter
def end_time(self, datetime_str):
self._end_time = datetime.strptime(datetime_str, DATETIME_FORMAT).strftime('%H:%M')
# Deleters
@start_day.deleter
def start_day(self):
del self._start_day
@start_date.deleter
def start_date(self):
del self._start_date
@start_time.deleter
def start_time(self):
del self._start_time
@end_time.deleter
def end_time(self):
del self._end_time

37
beesdoo_website_shift/data/res_config_data.xml

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2017-2018 Rémy Taymans <remytaymans@gmail.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<openerp>
<data noupdate="1">
<record id="beesdoo_website_shift.irregular_shift_limit" model="ir.config_parameter">
<field name="key">beesdoo_website_shift.irregular_shift_limit</field>
<field name="value">0</field>
</record>
<record id="beesdoo_website_shift.highlight_rule" model="ir.config_parameter">
<field name="key">beesdoo_website_shift.highlight_rule</field>
<field name="value">3</field>
</record>
<record id="beesdoo_website_shift.hide_rule" model="ir.config_parameter">
<field name="key">beesdoo_website_shift.hide_rule</field>
<field name="value">20</field>
</record>
<record id="beesdoo_website_shift.irregular_enable_sign_up" model="ir.config_parameter">
<field name="key">beesdoo_website_shift.irregular_enable_sign_up</field>
<field name="value">True</field>
</record>
<record id="beesdoo_website_shift.irregular_past_shift_limit" model="ir.config_parameter">
<field name="key">beesdoo_website_shift.irregular_past_shift_limit</field>
<field name="value">10</field>
</record>
<record id="beesdoo_website_shift.regular_past_shift_limit" model="ir.config_parameter">
<field name="key">beesdoo_website_shift.regular_past_shift_limit</field>
<field name="value">10</field>
</record>
<record id="beesdoo_website_shift.regular_next_shift_limit" model="ir.config_parameter">
<field name="key">beesdoo_website_shift.regular_next_shift_limit</field>
<field name="value">13</field>
</record>
</data>
</openerp>

2
beesdoo_website_shift/i18n/fr_BE.po

@ -77,7 +77,7 @@ msgstr "Créneaux"
#. module: beesdoo_portal_shift #. module: beesdoo_portal_shift
#: model:ir.ui.view,arch_db:beesdoo_portal_shift.task_template #: model:ir.ui.view,arch_db:beesdoo_portal_shift.task_template
msgid "Super Co-operator"
msgid "Super Cooperator"
msgstr "Super-coopérateur" msgstr "Super-coopérateur"
#. module: beesdoo_portal_shift #. module: beesdoo_portal_shift

1
beesdoo_website_shift/models/__init__.py

@ -0,0 +1 @@
from . import res_config

103
beesdoo_website_shift/models/res_config.py

@ -0,0 +1,103 @@
# -*- coding: utf-8 -*-
# Copyright 2017-2018 Rémy Taymans <remytaymans@gmail.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from ast import literal_eval
from openerp import fields, models, api
PARAMS = [
('irregular_shift_limit', 'beesdoo_website_shift.irregular_shift_limit'),
('highlight_rule', 'beesdoo_website_shift.highlight_rule'),
('hide_rule', 'beesdoo_website_shift.hide_rule'),
('irregular_enable_sign_up', 'beesdoo_website_shift.irregular_enable_sign_up'),
('irregular_past_shift_limit', 'beesdoo_website_shift.irregular_past_shift_limit'),
('regular_past_shift_limit', 'beesdoo_website_shift.regular_past_shift_limit'),
('regular_next_shift_limit', 'beesdoo_website_shift.regular_next_shift_limit'),
]
class WebsiteShiftConfigSettings(models.TransientModel):
_name = 'beesdoo.website.shift.config.settings'
_inherit = 'res.config.settings'
# Irregular worker settings
irregular_shift_limit = fields.Integer(
help="Maximum shift that will be shown"
)
highlight_rule = fields.Integer(
help="Treshold of available space in a shift that trigger the highlight of the shift"
)
hide_rule = fields.Integer(
help="Treshold ((available space)/(max space)) in percentage of available space under wich the shift is hidden"
)
irregular_enable_sign_up = fields.Boolean(
help="Enable shift sign up for irregular worker"
)
irregular_past_shift_limit = fields.Integer(
help="Maximum past shift that will be shown for irregular worker"
)
# Regular worker settings
regular_past_shift_limit = fields.Integer(
help="Maximum past shift that will be shown for regular worker"
)
regular_next_shift_limit = fields.Integer(
help="Maximun number of next shift that will be shown"
)
@api.multi
def set_params(self):
self.ensure_one()
for field_name, key_name in PARAMS:
value = getattr(self, field_name)
self.env['ir.config_parameter'].set_param(key_name, str(value))
@api.multi
def get_default_irregular_shift_limit(self):
return {
'irregular_shift_limit': int(self.env['ir.config_parameter'].get_param(
'beesdoo_website_shift.irregular_shift_limit'))
}
@api.multi
def get_default_highlight_rule(self):
return {
'highlight_rule': int(self.env['ir.config_parameter'].get_param('beesdoo_website_shift.highlight_rule'))
}
@api.multi
def get_default_hide_rule(self):
return {
'hide_rule': int(self.env['ir.config_parameter'].get_param('beesdoo_website_shift.hide_rule'))
}
@api.multi
def get_default_irregular_shift_sign_up(self):
return {
'irregular_enable_sign_up': literal_eval(self.env['ir.config_parameter'].get_param(
'beesdoo_website_shift.irregular_enable_sign_up'))
}
@api.multi
def get_default_irregular_past_shift_limit(self):
return {
'irregular_past_shift_limit': int(self.env['ir.config_parameter'].get_param(
'beesdoo_website_shift.irregular_past_shift_limit'))
}
@api.multi
def get_default_regular_past_shift_limit(self):
return {
'regular_past_shift_limit': int(self.env['ir.config_parameter'].get_param(
'beesdoo_website_shift.regular_past_shift_limit'))
}
@api.multi
def get_default_regular_next_shift_limit(self):
return {
'regular_next_shift_limit': int(self.env['ir.config_parameter'].get_param(
'beesdoo_website_shift.regular_next_shift_limit'))
}

685
beesdoo_website_shift/views/my_shift_website_templates.xml

@ -0,0 +1,685 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2017-2018 Rémy Taymans <remytaymans@gmail.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<openerp>
<!-- Add menu entries -->
<template id="my_shift_link" name="Link to frontend portal" inherit_id="website.layout">
<xpath expr="//li[@id='o_logout']" position="before">
<li><a href="/my/shift" role="menuitem">My Shift</a></li>
</xpath>
</template>
<!-- Reusable templates -->
<template
id="my_shift_title"
name="My Shift Title">
<div class="oe_structure"/>
<section class="wrap">
<div class="container">
<div class="row">
<div class="col-md-12">
<h1 class="text-center">
Your shifts
</h1>
</div>
</div>
</div>
</section>
<div class="oe_structure"/>
</template>
<template
id="my_shift_worker_status_title"
name="My Shift Worker Status Title">
<div class="oe_structure"/>
<section class="wrap">
<div class="container">
<div class="row">
<div class="col-md-12">
<h2>
Worker status
<span t-att-class="'label %s pull-right' % ('label-success' if status.can_shop else 'label-danger',)">
<span class="fa fa-shopping-cart"></span>
<t t-if="status.can_shop">
<span class="fa fa-check"></span>
</t>
<t t-if="not status.can_shop">
<span class="fa fa-times"></span>
</t>
</span>
</h2>
</div>
</div>
</div>
</section>
<div class="oe_structure"/>
</template>
<template
id="my_shift_worker_status_common"
name="My Shift Worker Status Common">
<p>
<label>Working Mode:</label>
<t t-esc="dict(status.fields_get(allfields=['working_mode'])['working_mode']['selection'])[status.working_mode]"/>
</p>
<p t-if="status.super">
You are a Super Cooperator
</p>
<p>
<label>Status:</label>
<t t-esc="dict(status.fields_get(allfields=['status'])['status']['selection'])[status.status]"/>
</p>
<p t-if="status.holiday_start_time and status.holiday_start_time > status.today or status.status == 'holiday'">
<label>Begin of Holiday:</label>
<t t-esc="time.strftime('%A %d %B %Y', time.strptime(status.holiday_start_time, '%Y-%m-%d'))"/>
</p>
<p t-if="status.holiday_end_time and status.holiday_end_time > status.today or status.status == 'holiday'">
<label>End of Holiday:</label>
<t t-esc="time.strftime('%A %d %B %Y', time.strptime(status.holiday_end_time, '%Y-%m-%d'))"/>
</p>
</template>
<template
id="my_shift_next_shifts"
name="My Shift : Next Shifts">
<div class="oe_structure"/>
<section class="wrap">
<div class="container">
<div class="row">
<div class="col-md-12">
<h2>
Your next shifts
</h2>
</div>
</div>
</div>
</section>
<div class="oe_structure"/>
<section class="wrap" t-if="is_regular">
<div class="container">
<div class="row">
<div class="col-md-12">
<div class="alert alert-warning">
<strong>Warning !</strong> For the moment public holidays are not taken into account. If your shift
occures during a public holiday, you do not have to do it.
</div>
</div>
</div>
</div>
</section>
<div class="oe_structure"/>
<div class="visible-xs" t-foreach="subscribed_shifts" t-as="shift">
<div class="panel panel-default">
<div class="panel-heading clearfix">
<div class="panel-title">
<t t-esc="'%s %s' % (shift.start_day, shift.start_date)"/>
<span t-esc="shift.start_time"/> -
<span t-esc="shift.end_time"/>
</div>
</div>
<div class="panel-body">
<t t-esc="shift.task_type_name"/>
<button type="button" class="btn btn-default btn-sm pull-right"
t-if="shift.super_coop_name"
data-toggle="modal"
t-att-data-target="'#super_coop-shift-%s' % shift.id">
<span class="fa fa-info" aria-hidden="true"></span>
Super Cooperator Info
</button>
</div>
</div>
</div>
<table class="hidden-xs table table-striped" t-if="subscribed_shifts">
<thead>
<tr>
<th>Day</th>
<th>Date</th>
<th>Time</th>
<th>Type of Shift</th>
<th class="text-center">Super Cooperator Info</th>
</tr>
</thead>
<tbody>
<t t-foreach="subscribed_shifts" t-as="shift">
<tr>
<td>
<t t-esc="shift.start_day"/>
</td>
<td>
<t t-esc="shift.start_date"/>
</td>
<td>
<span t-esc="shift.start_time"/> -
<span t-esc="shift.end_time"/>
</td>
<td>
<t t-esc="shift.task_type_name"/>
</td>
<td class="text-center">
<button type="button" class="btn btn-default btn-sm"
t-if="shift.super_coop_name"
data-toggle="modal"
t-att-data-target="'#super_coop-shift-%s' % shift.id">
<span class="fa fa-info" aria-hidden="true"></span>
</button>
</td>
</tr>
</t>
</tbody>
</table>
<!-- Super Cooperator info modal -->
<t t-foreach="subscribed_shifts" t-as="shift">
<div class="modal fade" t-if="shift.super_coop_name" t-att-id="'super_coop-shift-%s' % shift.id" tabindex="-1" role="dialog"
t-att-aria-labelledby="'super_coop-shift-%s-label' % shift.id">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
<h4 class="modal-title" t-att-id="'super_coop-shift-%s-label' % shift.id">
<t t-esc="shift.super_coop_name"/>
</h4>
</div>
<div class="modal-body">
<i class="fa fa-phone" aria-hidden="true"></i> <t t-esc="shift.super_coop_phone"/><br/>
<i class="fa fa-envelope" aria-hidden="true"></i>
<a t-att-href="'mailto:%s' % shift.super_coop_email">
<t t-esc="shift.super_coop_email"/>
</a>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
</t>
<section class="wrap" t-if="not subscribed_shifts">
<div class="container">
<div class="row">
<div class="col-md-12">
<div class="alert alert-warning">
<strong>Warning !</strong> You have not yet signed up to a shift.
</div>
</div>
</div>
</div>
</section>
<div class="oe_structure"/>
</template>
<template
id="my_shift_past_shifts"
name="My Shift : Past Shifts">
<div class="oe_structure"/>
<section class="wrap">
<div class="container">
<div class="row">
<div class="col-md-12">
<h2>
Your past shifts
</h2>
</div>
</div>
</div>
</section>
<div class="oe_structure"/>
<div class="visible-xs" t-foreach="past_shifts" t-as="shift">
<div class="panel panel-default">
<div class="panel-heading clearfix">
<div class="panel-title">
<t t-esc="time.strftime('%A %d %B %Y', time.strptime(shift.start_time, '%Y-%m-%d %H:%M:%S'))"/>
<span t-field="shift.start_time" t-field-options='{"format": "HH:mm"}'/> -
<span t-field="shift.end_time" t-field-options='{"format": "HH:mm"}'/>
</div>
</div>
<div class="panel-body">
<t t-esc="shift.task_type_id.name"/>
</div>
</div>
</div>
<table class="hidden-xs table table-striped" t-if="past_shifts">
<thead>
<tr>
<th>Day</th>
<th>Date</th>
<th>Time</th>
<th>Type of Shift</th>
<th>Status</th>
</tr>
</thead>
<tbody>
<t t-foreach="past_shifts" t-as="shift">
<tr>
<td>
<t t-esc="time.strftime('%A', time.strptime(shift.start_time, '%Y-%m-%d %H:%M:%S'))"/>
</td>
<td>
<t t-esc="time.strftime('%d %B %Y', time.strptime(shift.start_time, '%Y-%m-%d %H:%M:%S'))"/>
</td>
<td>
<span t-field="shift.start_time" t-field-options='{"format": "HH:mm"}'/> -
<span t-field="shift.end_time" t-field-options='{"format": "HH:mm"}'/>
</td>
<td>
<t t-esc="shift.task_type_id.name"/>
</td>
<td>
<t t-esc="shift.stage_id.name"/>
</td>
</tr>
</t>
</tbody>
</table>
<section class="wrap" t-if="not past_shifts">
<div class="container">
<div class="row">
<div class="col-md-12">
<div class="alert alert-info">
<strong>Info !</strong> You don't have any past shift.
</div>
</div>
</div>
</div>
</section>
<div class="oe_structure"/>
</template>
<template
id="available_shift_irregular_worker"
name="Available Shift for Irregular Worker">
<div class="oe_structure"/>
<div class="visible-xs" t-foreach="shift_templates" t-as="shift_count_subscribed">
<t t-set="shift" t-value="shift_count_subscribed[0]" />
<t t-set="count" t-value="shift_count_subscribed[1]" />
<t t-set="is_subscribed" t-value="shift_count_subscribed[2]" />
<t t-set="highlight_class" t-value="'panel-warning' if count >= highlight_rule else 'panel-default'"/>
<div t-att-class="'panel %s' % highlight_class">
<div class="panel-heading clearfix">
<div class="panel-title pull-left">
<t t-esc="time.strftime('%A %d %B %Y', time.strptime(shift.start_time, '%Y-%m-%d %H:%M:%S'))"/>
<span t-field="shift.start_time" t-field-options='{"format": "HH:mm"}'/> -
<span t-field="shift.end_time" t-field-options='{"format": "HH:mm"}'/>
</div>
<div class="label label-default pull-right">
<t t-esc="count"/> space(s)
</div>
</div>
<div class="panel-body clearfix">
<t t-esc="shift.task_type_id.name"/>
<t t-if="is_subscribed">
<div class="label label-success pull-right">
<span class="fa fa-check" aria-hidden="true"></span>
Subscribed
</div>
</t>
<t t-if="irregular_enable_sign_up and not is_subscribed">
<button type="button" class="btn btn-default btn-sm pull-right" data-toggle="modal"
t-att-data-target="'#subscribe-shift-%s' % shift.id">
<span class="fa fa-user-plus" aria-hidden="true"></span>
Subscribe
</button>
</t>
</div>
</div>
</div>
<table class="hidden-xs table table-striped">
<thead>
<tr>
<th>Day</th>
<th>Date</th>
<th>Time</th>
<th>Type of Shift</th>
<th class="text-center">Available Spaces</th>
<th class="text-center" t-if="irregular_enable_sign_up">Subscribed</th>
</tr>
</thead>
<tbody>
<t t-foreach="shift_templates" t-as="shift_count_subscribed">
<t t-set="shift" t-value="shift_count_subscribed[0]" />
<t t-set="count" t-value="shift_count_subscribed[1]" />
<t t-set="is_subscribed" t-value="shift_count_subscribed[2]" />
<tr t-attf-class="{{ 'warning' if count >= highlight_rule else '' }}">
<td>
<t t-esc="time.strftime('%A', time.strptime(shift.start_time, '%Y-%m-%d %H:%M:%S'))"/>
</td>
<td>
<t t-esc="time.strftime('%d %B %Y', time.strptime(shift.start_time, '%Y-%m-%d %H:%M:%S'))"/>
</td>
<td>
<span t-field="shift.start_time" t-field-options='{"format": "HH:mm"}'/> -
<span t-field="shift.end_time" t-field-options='{"format": "HH:mm"}'/>
</td>
<td>
<t t-esc="shift.task_type_id.name"/>
</td>
<td class="text-center">
<t t-esc="count"/>
</td>
<td class="text-center" t-if="irregular_enable_sign_up">
<t t-if="is_subscribed">
<div class="label label-success">
<span class="fa fa-check" aria-hidden="true"></span>
Subscribed
</div>
</t>
<t t-if="not is_subscribed">
<button type="button" class="btn btn-default btn-sm" data-toggle="modal"
t-att-data-target="'#subscribe-shift-%s' % shift.id">
<span class="fa fa-user-plus" aria-hidden="true"></span>
Subscribe
</button>
</t>
</td>
</tr>
</t>
</tbody>
</table>
<!-- Subscribe check -->
<t t-foreach="shift_templates" t-as="shift_count_subscribed">
<t t-set="shift" t-value="shift_count_subscribed[0]" />
<t t-set="count" t-value="shift_count_subscribed[1]" />
<t t-set="is_subscribed" t-value="shift_count_subscribed[2]" />
<div class="modal fade" t-att-id="'subscribe-shift-%s' % shift.id" tabindex="-1" role="dialog"
t-att-aria-labelledby="'subscribe-shift-%s-label' % shift.id">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
<h4 class="modal-title" t-att-id="'subscribe-shift-%s-label' % shift.id">
Are you shure you want to subscribe to this shift?
</h4>
</div>
<div class="modal-body">
<t t-esc="time.strftime('%A', time.strptime(shift.start_time, '%Y-%m-%d %H:%M:%S'))"/>
<t t-esc="time.strftime('%d %B %Y', time.strptime(shift.start_time, '%Y-%m-%d %H:%M:%S'))"/>
<span t-field="shift.start_time" t-field-options='{"format": "HH:mm"}'/> -
<span t-field="shift.end_time" t-field-options='{"format": "HH:mm"}'/><br/>
<t t-esc="shift.task_type_id.name"/><br/>
<t t-esc="count"/> available space(s)
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
<a class="btn btn-primary"
t-if="irregular_enable_sign_up"
t-att-href="'/shift/%s/subscribe?nexturl=%s' % (shift.id, nexturl)">
Subscribe
</a>
</div>
</div>
</div>
</div>
</t>
<div class="oe_structure"/>
</template>
<!-- Shift for non-worker -->
<template
id="my_shift_non_worker"
name="My Shift for Non Worker"
page="True">
<t t-call="website.layout">
<t t-call="beesdoo_website_shift.my_shift_title"/>
<section class="wrap">
<div class="container">
<div class="row">
<div class="col-md-12">
<div class="alert alert-info">
You don't have to participate to shift system.
</div>
</div>
</div>
</div>
</section>
<div class="oe_structure"/>
</t>
</template>
<!-- Shifts Exempted Workers -->
<template
id="my_shift_exempted_worker"
name="My Shifts for Exempted Workers"
page="True">
<t t-call="website.layout">
<t t-call="beesdoo_website_shift.my_shift_title"/>
<section class="wrap">
<div class="container">
<div class="row">
<div class="col-xs-12 col-md-4 pull-right">
<t t-call="beesdoo_website_shift.my_shift_worker_status_title"/>
<t t-call="beesdoo_website_shift.my_shift_worker_status_common"/>
<p t-if="status.exempt_reason_id">
<label>Exempt Reason:</label>
<t t-esc="status.exempt_reason_id.name"/>
</p>
<div class="oe_structure"/>
</div>
<div class="col-xs-12 col-md-8">
<section class="wrap">
<div class="container">
<div class="row">
<div class="col-md-12">
<div class="alert alert-info">
You don't have to participate to shift system.
</div>
</div>
</div>
</div>
</section>
<div class="oe_structure"/>
</div> <!-- col-md-8 -->
</div> <!-- row -->
</div> <!-- container -->
</section>
<div class="oe_structure"/>
</t>
</template>
<!-- Shifts for Regular Workers -->
<template
id="my_shift_regular_worker"
name="My Shifts for Regular Workers"
page="True">
<t t-call="website.layout">
<t t-call="beesdoo_website_shift.my_shift_title"/>
<section class="wrap">
<div class="container">
<div class="row">
<div class="col-xs-12 col-md-4 pull-right">
<t t-call="beesdoo_website_shift.my_shift_worker_status_title"/>
<t t-call="beesdoo_website_shift.my_shift_worker_status_common"/>
<p t-if="status.sr != 0">
<label>Shift in Advance:</label>
<t t-esc="status.sr"/>
</p>
<p t-if="status.sc != 0">
<label>Compensation Shift:</label>
<t t-esc="status.sc"/>
</p>
<p t-if="status.alert_start_time">
<label>In Alert Since:</label>
<t t-esc="time.strftime('%A %d %B %Y', time.strptime(status.alert_start_time, '%Y-%m-%d'))"/>
</p>
<p t-if="status.extension_start_time">
<label>In Extension Since:</label>
<t t-esc="time.strftime('%A %d %B %Y', time.strptime(status.extension_start_time, '%Y-%m-%d'))"/>
</p>
<div class="oe_structure"/>
</div>
<div class="col-xs-12 col-md-8">
<t t-call="beesdoo_website_shift.my_shift_next_shifts"/>
<t t-call="beesdoo_website_shift.my_shift_past_shifts"/>
</div> <!-- col-md-8 -->
</div> <!-- row -->
</div> <!-- container -->
</section>
<div class="oe_structure"/>
</t>
</template>
<!-- Shifts for Irregular Workers -->
<template
id="my_shift_irregular_worker"
name="Shifts for Irregular Workers"
page="True">
<t t-call="website.layout">
<t t-call="beesdoo_website_shift.my_shift_title"/>
<section class="wrap">
<div class="container">
<div class="row">
<div class="col-xs-12 col-md-4 pull-right">
<t t-call="beesdoo_website_shift.my_shift_worker_status_title"/>
<t t-call="beesdoo_website_shift.my_shift_worker_status_common"/>
<p>
<label>Shift in Advance:</label>
<t t-esc="status.sr"/>
</p>
<p t-if="future_alert_date">
<label>Future Date of Alert:</label>
<t t-esc="time.strftime('%A %d %B %Y', time.strptime(future_alert_date, '%Y-%m-%d'))"/>
</p>
<p t-if="status.irregular_absence_date">
<label>Last Absence Date:</label>
<t t-esc="time.strftime('%A %d %B %Y', time.strptime(status.irregular_absence_date, '%Y-%m-%d'))"/>
</p>
<p t-if="status.irregular_absence_counter">
<label>Number of Absence:</label>
<t t-esc="status.irregular_absence_counter"/>
</p>
<div class="oe_structure"/>
</div>
<div class="col-xs-12 col-md-8">
<t t-call="beesdoo_website_shift.my_shift_next_shifts"/>
<section class="wrap">
<div class="container">
<div class="row">
<div class="col-md-12">
<h2>
Available Shifts
</h2>
</div>
</div>
</div>
</section>
<div class="oe_structure"/>
<section class="wrap">
<div class="container">
<div class="row">
<div class="col-xs-12 col-sm-6">
<p>
Explanation text
</p>
</div>
</div>
</div>
</section>
<div class="oe_structure"/>
<t t-call="beesdoo_website_shift.available_shift_irregular_worker"/>
<t t-call="beesdoo_website_shift.my_shift_past_shifts"/>
</div> <!-- col-md-8 -->
</div> <!-- row -->
</div> <!-- container -->
</section>
<div class="oe_structure"/>
</t>
</template>
</openerp>

100
beesdoo_website_shift/views/res_config_views.xml

@ -0,0 +1,100 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2017-2018 Rémy Taymans <remytaymans@gmail.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<openerp>
<data>
<record id="view_website_shift_config_irregular" model="ir.ui.view">
<field name="name">Website Shift Settings Irregular Worker</field>
<field name="model">beesdoo.website.shift.config.settings</field>
<field name="arch" type="xml">
<form string="Configure Website Shift Irregular Worker" class="oe_form_configuration">
<header>
<button string="Apply" type="object" name="execute" class="oe_highlight"/>
<button string="Cancel" type="object" name="cancel" class="oe_link" special="cancel"/>
</header>
<div>
<label for="irregular_shift_limit"/>
<field name="irregular_shift_limit"/>
</div>
<div>
<label for="highlight_rule"/>
<field name="highlight_rule"/>
</div>
<div>
<label for="hide_rule"/>
<field name="hide_rule"/>
</div>
<div>
<label for="irregular_enable_sign_up"/>
<field name="irregular_enable_sign_up"/>
</div>
<div>
<label for="irregular_past_shift_limit"/>
<field name="irregular_past_shift_limit"/>
</div>
</form>
</field>
</record>
<record id="view_website_shift_config_regular" model="ir.ui.view">
<field name="name">Website Shift Settings Regular Worker</field>
<field name="model">beesdoo.website.shift.config.settings</field>
<field name="arch" type="xml">
<form string="Configure Website Shift Regular Worker" class="oe_form_configuration">
<header>
<button string="Apply" type="object" name="execute" class="oe_highlight"/>
<button string="Cancel" type="object" name="cancel" class="oe_link" special="cancel"/>
</header>
<div>
<label for="regular_past_shift_limit"/>
<field name="regular_past_shift_limit"/>
</div>
<div>
<label for="regular_next_shift_limit"/>
<field name="regular_next_shift_limit"/>
</div>
</form>
</field>
</record>
<record id="action_website_shift_config_irregular" model="ir.actions.act_window">
<field name="name">Website Shift Settings Irregular Worker</field>
<field name="res_model">beesdoo.website.shift.config.settings</field>
<field name="view_id" ref="view_website_shift_config_irregular"/>
<field name="view_mode">form</field>
<field name="target">inline</field>
</record>
<record id="action_website_shift_config_regular" model="ir.actions.act_window">
<field name="name">Website Shift Settings Regular Worker</field>
<field name="res_model">beesdoo.website.shift.config.settings</field>
<field name="view_id" ref="view_website_shift_config_regular"/>
<field name="view_mode">form</field>
<field name="target">inline</field>
</record>
<menuitem
id="menu_website_shift_root"
name="Shift"
parent="website.menu_website_configuration"
sequence="20"/>
<menuitem
id="menu_website_shift_irregular"
name="Irregular Shift"
action="action_website_shift_config_irregular"
parent="menu_website_shift_root"
sequence="1"/>
<menuitem
id="menu_website_shift_regular"
name="Regular Shift"
action="action_website_shift_config_regular"
parent="menu_website_shift_root"
sequence="10"/>
</data>
</openerp>

228
beesdoo_website_shift/views/shift_website_templates.xml

@ -1,3 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2017-2018 Rémy Taymans <remytaymans@gmail.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<openerp> <openerp>
<!-- Add menu entries --> <!-- Add menu entries -->
@ -16,9 +21,9 @@
</record> </record>
</data> </data>
<!-- Available Tasks Templates for Regular Workers -->
<!-- Public Available Tasks Templates for Regular Workers -->
<template <template
id="task_template"
id="public_shift_template_regular_worker"
name="Available Tasks Templates for Regular Workers" name="Available Tasks Templates for Regular Workers"
page="True"> page="True">
<t t-call="website.layout"> <t t-call="website.layout">
@ -45,105 +50,106 @@
<div class="col-md-12"> <div class="col-md-12">
<p class="text-center"> <p class="text-center">
Subscribe via the member office or via Subscribe via the member office or via
<a href="mailto:volant@bees-coop.be">volant@bees-coop.be</a>
<a href="mailto:membre@bees-coop.be">membre@bees-coop.be</a>
</p> </p>
</div> </div>
</div> </div>
</div> </div>
</section> </section>
<div class="oe_structure"/>
<section class="wrap"> <section class="wrap">
<div class="container"> <div class="container">
<div class="row"> <div class="row">
<div class="col-md-12">
<p class="visible-xs text-center">
<span class="label label-warning">NSC</span> : This flag tells you that the shift needs a Super Co-operator
</p>
<div class="visible-xs" t-foreach="task_templates" t-as="template">
<ul class="list-group">
<li class="list-group-item">
<t t-esc="template.planning_id.name"/> :
<t t-esc="template.day_nb_id.name"/>
<t t-esc='float_to_time(template.start_time)' /> -
<t t-esc='float_to_time(template.end_time)'/>
<span class="label label-warning pull-right"
t-if="not template.super_coop_id">
NSC
</span>
</li>
<li class="list-group-item">
<t t-esc="template.task_type_id.name"/>
<span class="badge"
t-if="template.remaining_worker > 0">
<t t-esc="template.remaining_worker"/> space(s)
</span>
<span class="badge"
t-if="template.remaining_worker == 0">
full
</span>
</li>
</ul>
</div>
<div class="oe_structure"/>
<table class="hidden-xs table table-striped">
<thead>
<tr>
<th>Week</th>
<th class="hidden-sm">Task Template</th>
<th>Day</th>
<th>Time</th>
<th>Type of Task</th>
<th>Super Co-operator</th>
<th class="text-center">Available Spaces</th>
</tr>
</thead>
<tbody>
<t t-foreach="task_templates" t-as="template">
<!-- Row with no super coop will be shown in color -->
<tr t-attf-class="{{ 'warning' if not template.super_coop_id else '' }}">
<td>
<t t-esc="template.planning_id.name"/>
</td>
<td class="hidden-sm">
<t t-esc="template.name"/>
</td>
<td>
<div class="visible-xs" t-foreach="task_templates" t-as="template">
<div t-att-class="'panel %s' % ('panel-warning' if not template.super_coop_id else 'panel-default',)">
<div class="panel-heading clearfix">
<div class="panel-title pull-left">
<t t-esc="template.planning_id.name"/> :
<t t-esc="template.day_nb_id.name"/> <t t-esc="template.day_nb_id.name"/>
</td>
<td>
<t t-esc='float_to_time(template.start_time)' /> - <t t-esc='float_to_time(template.start_time)' /> -
<t t-esc='float_to_time(template.end_time)'/> <t t-esc='float_to_time(template.end_time)'/>
</td>
<td>
<t t-esc="template.task_type_id.name"/>
</td>
<td>
<t t-if="template.super_coop_id">
Yes
</t>
<t t-if="not template.super_coop_id">
Not yet
</t>
</td>
<td class="text-center">
<t t-esc="template.remaining_worker"/>
</td>
</div>
<div class="label label-default pull-right"
t-if="template.remaining_worker > 0">
<t t-esc="template.remaining_worker"/> space(s)
</div>
<div class="label label-default pull-right"
t-if="template.remaining_worker == 0">
full
</div>
</div>
<div class="panel-body clearfix">
<t t-esc="template.task_type_id.name"/>
<div class="label label-warning pull-right"
t-if="not template.super_coop_id">
Need Super Co-operator
</div>
</div>
</div>
</div>
<table class="hidden-xs table table-striped">
<thead>
<tr>
<th>Week</th>
<th>Day</th>
<th>Time</th>
<th>Type of Task</th>
<th>Super Co-operator</th>
<th class="text-center">Available Spaces</th>
</tr> </tr>
</t>
</tbody>
</table>
</div>
</div>
</thead>
<tbody>
<t t-foreach="task_templates" t-as="template">
<!-- Row with no super coop will be shown in color -->
<tr t-attf-class="{{ 'warning' if not template.super_coop_id else '' }}">
<td>
<t t-esc="template.planning_id.name"/>
</td>
<td>
<t t-esc="template.day_nb_id.name"/>
</td>
<td>
<t t-esc='float_to_time(template.start_time)' /> -
<t t-esc='float_to_time(template.end_time)'/>
</td>
<td>
<t t-esc="template.task_type_id.name"/>
</td>
<td>
<t t-if="template.super_coop_id">
Yes
</t>
<t t-if="not template.super_coop_id">
Not yet
</t>
</td>
<td class="text-center">
<t t-esc="template.remaining_worker"/>
</td>
</tr>
</t>
</tbody>
</table>
</div> <!-- col-md -->
</div> <!-- row -->
</div> <!-- container -->
</section> </section>
<div class="oe_structure"/>
</t> </t>
</template> </template>
<!-- Available shifts for irregular workers -->
<!-- Public Available Shifts for Irregular Workers -->
<template <template
id="shift_template"
id="public_shift_irregular_worker"
name="Available Shifts for Irregular Workers" name="Available Shifts for Irregular Workers"
page="True"> page="True">
<t t-call="website.layout"> <t t-call="website.layout">
@ -181,68 +187,18 @@
<section class="wrap"> <section class="wrap">
<div class="container"> <div class="container">
<div class="row"> <div class="row">
<div class="col-md-12">
<div class="visible-xs" t-foreach="shift_templates" t-as="shift_and_count">
<t t-set="count" t-value="shift_and_count[0]" />
<t t-set="shift" t-value="shift_and_count[1]" />
<ul class="list-group">
<li class="list-group-item">
<t t-esc="time.strftime('%A %d %B %Y', time.strptime(shift.start_time, '%Y-%m-%d %H:%M:%S'))"/>
<span t-field="shift.start_time" t-field-options='{"format": "HH:mm"}'/> -
<span t-field="shift.end_time" t-field-options='{"format": "HH:mm"}'/>
</li>
<li class="list-group-item">
<t t-esc="shift.task_type_id.name"/>
<span class="badge">
<t t-esc="count"/> space(s)
</span>
</li>
</ul>
</div>
<t t-call="beesdoo_website_shift.available_shift_irregular_worker"/>
<table class="hidden-xs table table-striped">
<thead>
<tr>
<th>Day</th>
<th>Date</th>
<th>Time</th>
<th class="hidden-sm">Shift</th>
<th>Type of Shift</th>
<th class="text-center">Available Spaces</th>
</tr>
</thead>
<tbody>
<t t-foreach="shift_templates" t-as="shift_and_count">
<t t-set="count" t-value="shift_and_count[0]" />
<t t-set="shift" t-value="shift_and_count[1]" />
<tr>
<td>
<t t-esc="time.strftime('%A', time.strptime(shift.start_time, '%Y-%m-%d %H:%M:%S'))"/>
</td>
<td>
<t t-esc="time.strftime('%d %B %Y', time.strptime(shift.start_time, '%Y-%m-%d %H:%M:%S'))"/>
</td>
<td>
<span t-field="shift.start_time" t-field-options='{"format": "HH:mm"}'/> -
<span t-field="shift.end_time" t-field-options='{"format": "HH:mm"}'/>
</td>
<td class="hidden-sm">
<t t-esc="shift.task_template_id.name"/>
</td>
<td>
<t t-esc="shift.task_type_id.name"/>
</td>
<td class="text-center">
<t t-esc="count"/>
</td>
</tr>
</t>
</tbody>
</table>
</div> <!-- col-md -->
</div> <!-- row --> </div> <!-- row -->
</div> <!-- container --> </div> <!-- container -->
</section> </section>
<div class="oe_structure"/>
</t> </t>
</template> </template>
</openerp> </openerp>
Loading…
Cancel
Save