上传修改后的主题
This commit is contained in:
6
spiffy_theme_backend/controllers/__init__.py
Normal file
6
spiffy_theme_backend/controllers/__init__.py
Normal file
@@ -0,0 +1,6 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# See LICENSE file for full copyright and licensing details.
|
||||
# Developed by Bizople Solutions Pvt. Ltd.
|
||||
|
||||
from . import main
|
||||
from . import pwa
|
||||
801
spiffy_theme_backend/controllers/main.py
Normal file
801
spiffy_theme_backend/controllers/main.py
Normal file
@@ -0,0 +1,801 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# See LICENSE file for full copyright and licensing details.
|
||||
# Developed by Bizople Solutions Pvt. Ltd.
|
||||
import datetime
|
||||
import pytz
|
||||
from odoo import http, models, fields, api, tools,SUPERUSER_ID,_
|
||||
from odoo.http import request
|
||||
from odoo.addons.web.controllers.dataset import DataSet as primary_colorDataset
|
||||
from ast import literal_eval
|
||||
from odoo.addons.web.controllers.home import Home as WebHome
|
||||
from odoo.service import security
|
||||
from odoo.exceptions import AccessError
|
||||
from odoo.addons.web.controllers.utils import ensure_db,is_user_internal
|
||||
from odoo.models import check_method_name
|
||||
import json
|
||||
import operator
|
||||
import re
|
||||
from odoo.addons.web.controllers.export import GroupsTreeNode,ExportXlsxWriter,GroupExportXlsxWriter
|
||||
from odoo.tools import pycompat
|
||||
from odoo.addons.web.controllers.session import Session as WebSession
|
||||
|
||||
class BackendConfigration(http.Controller):
|
||||
|
||||
@http.route(['/color/pallet/'], type='json', auth='public')
|
||||
def get_selected_pallet(self, **kw):
|
||||
config_vals = {}
|
||||
current_user = request.env.user
|
||||
app_light_bg_image = kw.get('app_light_bg_image')
|
||||
|
||||
if app_light_bg_image:
|
||||
if 'data:image/' in str(app_light_bg_image):
|
||||
light_bg_file = str(app_light_bg_image).split(',')
|
||||
app_light_bg_file_mimetype = light_bg_file[0]
|
||||
app_light_bg_image = light_bg_file[1]
|
||||
else:
|
||||
light_bg_file = str(app_light_bg_image).split("'")
|
||||
app_light_bg_image = light_bg_file[1]
|
||||
else:
|
||||
app_light_bg_image = False
|
||||
|
||||
config_vals.update({
|
||||
'light_primary_bg_color': kw.get('light_primary_bg_color'),
|
||||
'light_primary_text_color': kw.get('light_primary_text_color'),
|
||||
'light_bg_image': app_light_bg_image,
|
||||
'apply_light_bg_img': kw.get('apply_light_bg_img'),
|
||||
'tree_form_split_view': kw.get('tree_form_split_view'),
|
||||
'attachment_in_tree_view': kw.get('attachment_in_tree_view'),
|
||||
'separator': kw.get('selected_separator'),
|
||||
'tab': kw.get('selected_tab'),
|
||||
'checkbox': kw.get('selected_checkbox'),
|
||||
'radio': kw.get('selected_radio'),
|
||||
'popup': kw.get('selected_popup'),
|
||||
'use_custom_colors': kw.get('custom_color_pallet'),
|
||||
'color_pallet': kw.get('selected_color_pallet'),
|
||||
'appdrawer_custom_bg_color': kw.get('custom_drawer_bg'),
|
||||
'appdrawer_custom_text_color': kw.get('custom_drawer_text'),
|
||||
'use_custom_drawer_color': kw.get('custom_drawer_color_pallet'),
|
||||
'drawer_color_pallet': kw.get('selected_drawer_color_pallet'),
|
||||
'loader_style': kw.get('selected_loader'),
|
||||
'font_family': kw.get('selected_fonts'),
|
||||
'font_size': kw.get('selected_fontsize'),
|
||||
'chatter_position': kw.get('selected_chatter_position'),
|
||||
'top_menu_position': kw.get('selected_top_menu_position'),
|
||||
'theme_style': kw.get('selected_theme_style'),
|
||||
'list_view_density': kw.get('selected_list_view_density'),
|
||||
'list_view_sticky_header': kw.get('selected_list_view_sticky_header'),
|
||||
})
|
||||
|
||||
if current_user.backend_theme_config:
|
||||
current_user.backend_theme_config.sudo().update(config_vals)
|
||||
else:
|
||||
backend_config_record = request.env['backend.config'].sudo().create(
|
||||
config_vals)
|
||||
current_user.sudo().write({
|
||||
'backend_theme_config': backend_config_record.id
|
||||
})
|
||||
|
||||
return True
|
||||
|
||||
@http.route(['/color/pallet/data/'], type='http', auth='public', sitemap=False)
|
||||
def selected_pallet_data(self, **kw):
|
||||
company = request.env.company
|
||||
user = request.env.user
|
||||
admin_users = request.env['res.users'].sudo().search([
|
||||
('groups_id', 'in', request.env.ref('base.user_admin').id),
|
||||
('backend_theme_config', '!=', False),
|
||||
], order="id asc", limit=1)
|
||||
|
||||
admin_config = False
|
||||
if admin_users:
|
||||
admin_config = admin_users.backend_theme_config
|
||||
|
||||
if company.backend_theme_level == 'user_level':
|
||||
if user.backend_theme_config:
|
||||
config_vals = user.backend_theme_config
|
||||
elif admin_config:
|
||||
config_vals = admin_config
|
||||
else:
|
||||
config_vals = request.env['backend.config'].sudo().search(
|
||||
[], order="id asc", limit=1)
|
||||
else:
|
||||
if admin_config:
|
||||
config_vals = admin_config
|
||||
else:
|
||||
config_vals = request.env['backend.config'].sudo().search(
|
||||
[], order="id asc", limit=1)
|
||||
|
||||
values = {}
|
||||
separator_selection_dict = dict(
|
||||
config_vals._fields['separator'].selection)
|
||||
tab_selection_dict = dict(config_vals._fields['tab'].selection)
|
||||
checkbox_selection_dict = dict(
|
||||
config_vals._fields['checkbox'].selection)
|
||||
radio_selection_dict = dict(config_vals._fields['radio'].selection)
|
||||
popup_selection_dict = dict(config_vals._fields['popup'].selection)
|
||||
light_bg_image = config_vals.light_bg_image
|
||||
values.update({
|
||||
'config_vals': config_vals,
|
||||
'separator_selection_dict': separator_selection_dict,
|
||||
'tab_selection_dict': tab_selection_dict,
|
||||
'checkbox_selection_dict': checkbox_selection_dict,
|
||||
'radio_selection_dict': radio_selection_dict,
|
||||
'popup_selection_dict': popup_selection_dict,
|
||||
'app_background_image': light_bg_image,
|
||||
})
|
||||
|
||||
response = request.render(
|
||||
"spiffy_theme_backend.template_backend_config_data", values)
|
||||
|
||||
return response
|
||||
|
||||
@http.route(['/get/model/record'], type='json', auth='public')
|
||||
def get_record_data(self, **kw):
|
||||
company = request.env.company
|
||||
user = request.env.user
|
||||
admin_group_id = request.env.ref('base.user_admin').id
|
||||
is_admin = False
|
||||
if admin_group_id in user.groups_id.ids:
|
||||
is_admin = True
|
||||
admin_users = request.env['res.users'].sudo().search([
|
||||
('groups_id', 'in', request.env.ref('base.user_admin').id),
|
||||
('backend_theme_config', '!=', False),
|
||||
], order="id asc", limit=1)
|
||||
admin_users_ids = admin_users.ids
|
||||
admin_config = False
|
||||
if admin_users:
|
||||
admin_config = admin_users.backend_theme_config
|
||||
show_edit_mode = True
|
||||
for admin in admin_users:
|
||||
if admin.backend_theme_config:
|
||||
admin_config = admin.backend_theme_config
|
||||
break
|
||||
else:
|
||||
continue
|
||||
|
||||
if company.backend_theme_level == 'user_level':
|
||||
if user.backend_theme_config:
|
||||
record_vals = user.backend_theme_config
|
||||
elif admin_config:
|
||||
record_vals = admin_config
|
||||
else:
|
||||
record_vals = request.env['backend.config'].sudo().search(
|
||||
[], order="id asc", limit=1)
|
||||
else:
|
||||
if not user.id in admin_users_ids:
|
||||
show_edit_mode = False
|
||||
if admin_config:
|
||||
record_vals = admin_config
|
||||
else:
|
||||
record_vals = request.env['backend.config'].sudo().search(
|
||||
[], order="id asc", limit=1)
|
||||
|
||||
prod_obj = request.env['backend.config']
|
||||
record_dict = record_vals.read(set(prod_obj._fields))
|
||||
if user.dark_mode:
|
||||
darkmode = "dark_mode"
|
||||
else:
|
||||
darkmode = False
|
||||
if user.vertical_sidebar_pinned:
|
||||
pinned_sidebar = "pinned"
|
||||
else:
|
||||
pinned_sidebar = False
|
||||
|
||||
|
||||
if company.prevent_auto_save:
|
||||
prevent_auto_save = "prevent_auto_save"
|
||||
else:
|
||||
prevent_auto_save = False
|
||||
|
||||
if user.enable_todo_list:
|
||||
todo_list_enable = "enable_todo_list"
|
||||
else:
|
||||
todo_list_enable = False
|
||||
|
||||
record_val = {
|
||||
'record_dict': record_dict,
|
||||
'darkmode': darkmode,
|
||||
'pinned_sidebar': pinned_sidebar,
|
||||
'show_edit_mode': show_edit_mode,
|
||||
'is_admin': is_admin,
|
||||
'todo_list_enable': todo_list_enable,
|
||||
'prevent_auto_save': prevent_auto_save,
|
||||
}
|
||||
return record_val
|
||||
|
||||
@http.route(['/get-favorite-apps'], type='json', auth='public')
|
||||
def get_favorite_apps(self, **kw):
|
||||
user_id = request.env.user
|
||||
app_list = []
|
||||
if user_id.app_ids:
|
||||
for app in user_id.app_ids:
|
||||
irmenu = request.env['ir.ui.menu'].sudo().search(
|
||||
[('id', '=', app.app_id)])
|
||||
if irmenu:
|
||||
app_dict = {
|
||||
'name': app.name,
|
||||
'app_id': app.app_id,
|
||||
'app_xmlid': app.app_xmlid,
|
||||
'app_actionid': app.app_actionid,
|
||||
'line_id': app.id,
|
||||
'use_icon': irmenu.use_icon,
|
||||
'icon_class_name': irmenu.icon_class_name,
|
||||
'icon_img': irmenu.icon_img,
|
||||
'web_icon': irmenu.web_icon,
|
||||
'web_icon_data': irmenu.web_icon_data,
|
||||
}
|
||||
app_list.append(app_dict)
|
||||
record_val = {
|
||||
'app_list': app_list,
|
||||
}
|
||||
return record_val
|
||||
else:
|
||||
return False
|
||||
|
||||
@http.route(['/update-user-fav-apps'], type='json', auth='public')
|
||||
def update_favorite_apps(self, **kw):
|
||||
user_id = request.env.user
|
||||
user_id.sudo().write({
|
||||
'app_ids': [(0, 0, {
|
||||
'name': kw.get('app_name'),
|
||||
'app_id': kw.get('app_id'),
|
||||
})]
|
||||
})
|
||||
return True
|
||||
|
||||
@http.route(['/remove-user-fav-apps'], type='json', auth='public')
|
||||
def remove_favorite_apps(self, **kw):
|
||||
user_id = request.env.user
|
||||
|
||||
for line in user_id.app_ids:
|
||||
if line.app_id == str(kw.get('app_id')):
|
||||
user_id.sudo().write({
|
||||
'app_ids': [(3, line.id)]
|
||||
})
|
||||
return True
|
||||
|
||||
@http.route(['/get/active/menu'], type='json', auth='public')
|
||||
def get_active_menu_data(self, **kw):
|
||||
menu_items = []
|
||||
menu_records = request.env['ir.ui.menu'].search(
|
||||
[('parent_id', '=', False)])
|
||||
for menu in menu_records:
|
||||
menu_items.append({
|
||||
'menu_name': menu.complete_name,
|
||||
'menu_id': menu.id
|
||||
})
|
||||
return menu_items
|
||||
|
||||
@http.route(['/get/appsearch/data'], type='json', auth='public')
|
||||
def get_appsearch_data(self, menuOption=None, **kw):
|
||||
menu_items = []
|
||||
menu_records = request.env['ir.ui.menu'].search(
|
||||
[('name', 'ilike', kw.get('searchvals'))], order='id asc')
|
||||
if menuOption:
|
||||
for record in menu_records:
|
||||
if record.parent_path:
|
||||
parent_record = record.parent_path.split('/')
|
||||
parent_record_id = parent_record[0]
|
||||
if parent_record_id == menuOption:
|
||||
if not record.child_id:
|
||||
menu_items.append({
|
||||
'name': record.complete_name,
|
||||
'menu_id': record.id
|
||||
})
|
||||
else:
|
||||
for record in menu_records:
|
||||
if not record.child_id:
|
||||
menu_items.append({
|
||||
'name': record.complete_name,
|
||||
'menu_id': record.id,
|
||||
'previous_menu_id': record.parent_id.id,
|
||||
'action_id': record.action.id if record.action else None,
|
||||
})
|
||||
return menu_items
|
||||
|
||||
@http.route(['/get/tab/title/'], type='json', auth='public')
|
||||
def get_tab_title(self, **kw):
|
||||
company_id = request.env.company
|
||||
new_name = company_id.tab_name
|
||||
return new_name
|
||||
|
||||
@http.route(['/get/active/lang'], type='json', auth='public')
|
||||
def get_active_lang(self, **kw):
|
||||
lang_records = request.env['res.lang'].sudo().search(
|
||||
[('active', '=', 'True')])
|
||||
lang_list = []
|
||||
for lang in lang_records:
|
||||
lang_list.append({
|
||||
'lang_name': lang.name,
|
||||
'lang_code': lang.code,
|
||||
})
|
||||
|
||||
return lang_list
|
||||
|
||||
@http.route(['/change/active/lang'], type='json', auth='public')
|
||||
def biz_change_active_lang(self, **kw):
|
||||
request.env.user.lang = kw.get('lang')
|
||||
return True
|
||||
|
||||
@http.route('/text_color/label_color',type="json",auth="none")
|
||||
def text_color_label_color(self,**kw):
|
||||
generated_file_data = ''
|
||||
if 'options' in kw:
|
||||
if 'file_generator' and 'options' in kw['options']:
|
||||
check_method_name(kw['options']['file_generator'])
|
||||
file_generator = kw['options']['file_generator']
|
||||
options = json.loads(kw['options']['options'])
|
||||
uid = request.uid
|
||||
allowed_company_ids = [company_data['id'] for company_data in options.get('multi_company', [])]
|
||||
if not allowed_company_ids:
|
||||
company_str = request.httprequest.cookies.get('cids', str(request.env.user.company_id.id))
|
||||
allowed_company_ids = [int(str_id) for str_id in company_str.split(',')]
|
||||
report = request.env['account.report'].sudo().with_user(uid).with_context(allowed_company_ids=allowed_company_ids).browse(options['report_id'])
|
||||
btn_report_data = report.dispatch_report_action(options, file_generator)
|
||||
pdf_report_name = btn_report_data['file_name'].split('.')[0]
|
||||
new_pdf_report_name = pdf_report_name.replace(" ","")
|
||||
generated_file_data = {
|
||||
'file_content':btn_report_data['file_content'],
|
||||
'file_type':'.'+str(btn_report_data['file_type']),
|
||||
'file_name':new_pdf_report_name
|
||||
}
|
||||
elif 'data' and 'context' in kw['options']:
|
||||
data_context = kw['options']['context']
|
||||
|
||||
requestcontent = json.loads(kw['options']['data'])
|
||||
data = json.loads(data_context)
|
||||
context = data
|
||||
url, type_ = requestcontent[0], requestcontent[1]
|
||||
reportname = '???'
|
||||
report = request.env['ir.actions.report']
|
||||
|
||||
if type_ in ['qweb-pdf', 'qweb-text']:
|
||||
converter = 'pdf' if type_ == 'qweb-pdf' else 'text'
|
||||
extension = '.pdf' if type_ == 'qweb-pdf' else '.txt'
|
||||
|
||||
pattern = '/report/pdf/' if type_ == 'qweb-pdf' else '/report/text/'
|
||||
reportname = url.split(pattern)[1].split('?')[0]
|
||||
docids = None
|
||||
if '/' in reportname:
|
||||
reportname, docids = reportname.split('/')
|
||||
if docids:
|
||||
docids = [int(i) for i in docids.split(',') if i.isdigit()]
|
||||
report_data = report.sudo().with_context(context)._render_qweb_pdf(reportname, docids, data=data)[0]
|
||||
|
||||
report_obj = request.env['ir.actions.report']
|
||||
filereport = report_obj.with_context(context).sudo().search([('report_name', '=', reportname)], limit=1)
|
||||
# obj = request.env[filereport.model].browse(docids)
|
||||
# report_name = safe_eval(filereport.print_report_name, {'object': obj, 'time': time})
|
||||
file_name = filereport.name if filereport else 'Test'
|
||||
pdf_report_name = file_name.replace(" ","")
|
||||
new_report_name = re.sub('[/]',"",pdf_report_name)
|
||||
generated_file_data = {
|
||||
'file_content':report_data,
|
||||
'file_type':extension,
|
||||
'file_name':new_report_name
|
||||
}
|
||||
elif 'import_compat' in kw['options']['data']:
|
||||
params = json.loads(kw['options']['data'])
|
||||
model, fields, ids, domain, import_compat = \
|
||||
operator.itemgetter('model', 'fields', 'ids', 'domain', 'import_compat')(params)
|
||||
|
||||
Model = request.env[model].sudo().with_context(import_compat=import_compat, **params.get('context', {}))
|
||||
if not Model._is_an_ordinary_table():
|
||||
fields = [field for field in fields if field['name'] != 'id']
|
||||
|
||||
field_names = [f['name'] for f in fields]
|
||||
if import_compat:
|
||||
columns_headers = field_names
|
||||
else:
|
||||
columns_headers = [val['label'].strip() for val in fields]
|
||||
rows=None
|
||||
groupby = params.get('groupby')
|
||||
|
||||
if model not in request.env:
|
||||
return model
|
||||
|
||||
model_description = request.env['ir.model']._get(model).name
|
||||
if not import_compat and groupby:
|
||||
groupby_type = [Model._fields[x.split(':')[0]].type for x in groupby]
|
||||
domain = [('id', 'in', ids)] if ids else domain
|
||||
groups_data = Model.read_group(domain, [x if x != '.id' else 'id' for x in field_names], groupby, lazy=False)
|
||||
|
||||
tree = GroupsTreeNode(Model, field_names, groupby, groupby_type)
|
||||
for leaf in groups_data:
|
||||
tree.insert_leaf(leaf)
|
||||
with GroupExportXlsxWriter(fields, tree.count) as xlsx_writer:
|
||||
x, y = 1, 0
|
||||
for group_name, group in tree.children.items():
|
||||
x, y = xlsx_writer.write_group(x, y, group_name, group)
|
||||
generated_file_data = {
|
||||
'file_content':xlsx_writer.value,
|
||||
'file_type':'xlsx',
|
||||
'file_name':'test'}
|
||||
else:
|
||||
records = Model.browse(ids) if ids else Model.search(domain, offset=0, limit=False, order=False)
|
||||
export_data = records.export_data(field_names).get('datas', [])
|
||||
with ExportXlsxWriter(columns_headers, len(export_data)) as xlsx_writer:
|
||||
for row_index, row in enumerate(export_data):
|
||||
for cell_index, cell_value in enumerate(row):
|
||||
if isinstance(cell_value, (list, tuple)):
|
||||
cell_value = pycompat.to_text(cell_value)
|
||||
xlsx_writer.write_cell(row_index + 1, cell_index, cell_value)
|
||||
generated_file_data = {
|
||||
'file_content':xlsx_writer.value,
|
||||
'file_type':'.xlsx',
|
||||
'file_name':model_description}
|
||||
return generated_file_data
|
||||
|
||||
|
||||
@http.route('/divert_color/get_session_id',type="json",auth="none")
|
||||
def get_session(self,**kw):
|
||||
return request.session.sid
|
||||
|
||||
@http.route(['/active/dark/mode'], type='json', auth='public')
|
||||
def active_dark_mode(self, **kw):
|
||||
dark_mode = kw.get('dark_mode')
|
||||
backend_theme_config = request.env['backend.config'].sudo().search([])
|
||||
user = request.env.user
|
||||
if dark_mode == 'on':
|
||||
user.update({
|
||||
'dark_mode': True,
|
||||
})
|
||||
dark_mode = user.dark_mode
|
||||
return dark_mode
|
||||
elif dark_mode == 'off':
|
||||
user.update({
|
||||
'dark_mode': False,
|
||||
})
|
||||
dark_mode = user.dark_mode
|
||||
return dark_mode
|
||||
|
||||
@http.route(['/sidebar/behavior/update'], type='json', auth='public')
|
||||
def sidebar_behavior(self, **kw):
|
||||
user = request.env.user
|
||||
sidebar_pinned = kw.get('sidebar_pinned')
|
||||
user.update({
|
||||
'vertical_sidebar_pinned': sidebar_pinned,
|
||||
})
|
||||
return True
|
||||
|
||||
@http.route(['/get/dark/mode/data'], type='json', auth='public')
|
||||
def dark_mode_on(self, **kw):
|
||||
user = request.env.user
|
||||
dark_mode_value = user.dark_mode
|
||||
|
||||
return dark_mode_value
|
||||
|
||||
# SPIFFY MULTI TAB START
|
||||
@http.route(['/add/mutli/tab'], type='json', auth='public')
|
||||
def add_multi_tab(self, **kw):
|
||||
user = request.env.user
|
||||
# user.sudo().write({
|
||||
# 'multi_tab_ids': False,
|
||||
# })
|
||||
multi_tab_ids = user.multi_tab_ids.filtered(
|
||||
lambda mt: mt.name == kw.get('name'))
|
||||
if not multi_tab_ids:
|
||||
user.sudo().write({
|
||||
'multi_tab_ids': [(0, 0, {
|
||||
'name': kw.get('name'),
|
||||
'url': kw.get('url'),
|
||||
'actionId': kw.get('actionId'),
|
||||
'menuId': kw.get('menuId'),
|
||||
'menu_xmlid': kw.get('menu_xmlid'),
|
||||
})]
|
||||
})
|
||||
|
||||
return True
|
||||
|
||||
@http.route(['/get/mutli/tab'], type='json', auth='public')
|
||||
def get_multi_tab(self, **kw):
|
||||
obj = request.env['biz.multi.tab']
|
||||
user = request.env.user
|
||||
if user.multi_tab_ids:
|
||||
record_dict = user.multi_tab_ids.sudo().read(set(obj._fields))
|
||||
return record_dict
|
||||
else:
|
||||
return False
|
||||
|
||||
@http.route(['/remove/multi/tab'], type='json', auth='public')
|
||||
def remove_multi_tab(self, **kw):
|
||||
multi_tab = request.env['biz.multi.tab'].sudo().search(
|
||||
[('id', '=', kw.get('multi_tab_id'))])
|
||||
multi_tab.unlink()
|
||||
user = request.env.user
|
||||
multi_tab_count = len(user.multi_tab_ids)
|
||||
values = {
|
||||
'removeTab': True,
|
||||
'multi_tab_count': multi_tab_count,
|
||||
}
|
||||
return values
|
||||
|
||||
@http.route(['/update/tab/details'], type='json', auth='public')
|
||||
def update_tabaction(self, **kw):
|
||||
tabId = kw.get('tabId')
|
||||
TabTitle = kw.get('TabTitle')
|
||||
url = kw.get('url')
|
||||
ActionId = kw.get('ActionId')
|
||||
menu_xmlid = kw.get('menu_xmlid')
|
||||
|
||||
multi_tab = request.env['biz.multi.tab'].sudo().search(
|
||||
[('id', '=', tabId)])
|
||||
if multi_tab:
|
||||
multi_tab.sudo().write({
|
||||
'name': TabTitle or multi_tab.name,
|
||||
'url': url or multi_tab.url,
|
||||
'actionId': ActionId or multi_tab.ActionId,
|
||||
'menu_xmlid': menu_xmlid or multi_tab.menu_xmlid,
|
||||
})
|
||||
return True
|
||||
# SPIFFY MULTI TAB END
|
||||
|
||||
@http.route(['/add/bookmark/link'], type='json', auth='public')
|
||||
def add_bookmark_link(self, **kw):
|
||||
user = request.env.user
|
||||
bookmark_ids = user.bookmark_ids.filtered(
|
||||
lambda b: b.name == kw.get('name'))
|
||||
if not bookmark_ids:
|
||||
user.sudo().write({
|
||||
'bookmark_ids': [(0, 0, {
|
||||
'name': kw.get('name'),
|
||||
'url': kw.get('url'),
|
||||
'title': kw.get('title'),
|
||||
})]
|
||||
})
|
||||
|
||||
return True
|
||||
|
||||
@http.route(['/update/bookmark/link'], type='json', auth='public')
|
||||
def update_bookmark_link(self, **kw):
|
||||
bookmark = request.env['bookmark.link'].sudo().search(
|
||||
[('id', '=', kw.get('bookmark_id'))])
|
||||
updated_bookmark = bookmark.update({
|
||||
'name': kw.get('bookmark_name'),
|
||||
'title': kw.get('bookmark_title'),
|
||||
})
|
||||
return True
|
||||
|
||||
@http.route(['/remove/bookmark/link'], type='json', auth='public')
|
||||
def remove_bookmark_link(self, **kw):
|
||||
bookmark = request.env['bookmark.link'].sudo().search(
|
||||
[('id', '=', kw.get('bookmark_id'))])
|
||||
bookmark.unlink()
|
||||
return True
|
||||
|
||||
@http.route(['/get/bookmark/link'], type='json', auth='public')
|
||||
def get_bookmark_link(self, **kw):
|
||||
obj = request.env['bookmark.link']
|
||||
user = request.env.user
|
||||
record_dict = user.bookmark_ids.sudo().read(set(obj._fields))
|
||||
return record_dict
|
||||
|
||||
@http.route(['/get/attachment/data'], type='json', auth='public')
|
||||
def get_attachment_data(self, **kw):
|
||||
rec_ids = kw.get('rec_ids')
|
||||
for rec in rec_ids:
|
||||
if isinstance(rec, str):
|
||||
rec_ids.remove(rec)
|
||||
if kw.get('model') and rec_ids:
|
||||
# FOR DATA SPEED ISSUE; SEARCH ATTACHMENT DATA WITH SQL QUERY
|
||||
attachments = request.env['ir.attachment'].search([
|
||||
('res_model', '=', kw.get('model'))
|
||||
])
|
||||
attachment_data = []
|
||||
attachment_res_id_set = set()
|
||||
for attachment in attachments:
|
||||
attachment_res_id_set.add(attachment.res_id)
|
||||
dict = {}
|
||||
for res_id in attachment_res_id_set:
|
||||
filtered_attachment_record = attachments.filtered(
|
||||
lambda attachment: attachment.res_id == res_id)
|
||||
for fac in filtered_attachment_record:
|
||||
if dict.get(res_id):
|
||||
dict[res_id].append({
|
||||
'attachment_id': fac.id,
|
||||
'attachment_mimetype': fac.mimetype,
|
||||
'attachment_name': fac.name,
|
||||
})
|
||||
else:
|
||||
dict[res_id] = [{
|
||||
'attachment_id': fac.id,
|
||||
'attachment_mimetype': fac.mimetype,
|
||||
'attachment_name': fac.name,
|
||||
}]
|
||||
attachment_data.append(dict)
|
||||
return attachment_data
|
||||
|
||||
@http.route(['/get/irmenu/icondata'], type='json', auth='public')
|
||||
def get_irmenu_icondata(self, **kw):
|
||||
irmenuobj = request.env['ir.ui.menu']
|
||||
irmenu = request.env['ir.ui.menu'].sudo().search(
|
||||
[('id', 'in', kw.get('menu_ids'))])
|
||||
|
||||
app_menu_dict = {}
|
||||
for menu in irmenu:
|
||||
menu_dict = menu.read(set(irmenuobj._fields))
|
||||
app_menu_dict[menu.id] = menu_dict
|
||||
return app_menu_dict
|
||||
|
||||
# TO DO LIST CONTROLLERS
|
||||
@http.route(['/show/user/todo/list/'], type='http', auth='public', sitemap=False)
|
||||
def show_user_todo_list(self, **kw):
|
||||
company = request.env.company
|
||||
user = request.env.user
|
||||
|
||||
values = {}
|
||||
user_tz_offset = user.tz_offset
|
||||
user_tz_offset_time = datetime.datetime.strptime(user_tz_offset, '%z').utcoffset()
|
||||
today_date = datetime.datetime.now()
|
||||
today_date_with_offset = datetime.datetime.now() + user_tz_offset_time
|
||||
|
||||
values.update({
|
||||
'user': user.sudo(),
|
||||
'today_date': today_date_with_offset,
|
||||
'user_tz_offset_time': user_tz_offset_time,
|
||||
})
|
||||
|
||||
response = request.render("spiffy_theme_backend.to_do_list_template", values)
|
||||
|
||||
return response
|
||||
|
||||
@http.route(['/create/todo'], type='json', auth='public')
|
||||
def create_todo(self, **kw):
|
||||
user_id = kw.get('user_id', None)
|
||||
note_title = kw.get('note_title', None)
|
||||
note_description = kw.get('note_description', None)
|
||||
is_update = kw.get('is_update')
|
||||
note_id = kw.get('note_id', None)
|
||||
note_pallet = kw.get('note_pallet', None)
|
||||
|
||||
user = request.env.user
|
||||
|
||||
if user_id and (note_title or note_description):
|
||||
user_tz_offset = user.tz_offset
|
||||
user_tz_offset_time = datetime.datetime.strptime(user_tz_offset, '%z')
|
||||
|
||||
todo_obj = request.env['todo.list'].sudo()
|
||||
|
||||
if is_update:
|
||||
todo_record = todo_obj.browse(int(note_id))
|
||||
todo_record.update({
|
||||
'name': note_title,
|
||||
'description': note_description,
|
||||
'note_color_pallet': note_pallet,
|
||||
})
|
||||
else:
|
||||
todo_record = todo_obj.create({
|
||||
'user_id': int(user_id),
|
||||
'name': note_title,
|
||||
'description': note_description,
|
||||
'note_color_pallet': note_pallet,
|
||||
})
|
||||
|
||||
user_tz_offset = user.tz_offset
|
||||
user_tz_offset_time = datetime.datetime.strptime(user_tz_offset, '%z').utcoffset()
|
||||
today_date = datetime.datetime.now()
|
||||
today_date_with_offset = datetime.datetime.now() + user_tz_offset_time
|
||||
|
||||
note_content = request.env['ir.ui.view']._render_template(
|
||||
"spiffy_theme_backend.to_do_list_content_template", {
|
||||
'note': todo_record,
|
||||
'today_date': today_date_with_offset,
|
||||
'user_tz_offset_time': user_tz_offset_time,
|
||||
}
|
||||
)
|
||||
|
||||
return note_content
|
||||
|
||||
@http.route(['/delete/todo'], type='json', auth='public')
|
||||
def delete_todo(self, **kw):
|
||||
note_id = kw.get('noteID', None)
|
||||
if note_id:
|
||||
todo_obj = request.env['todo.list'].sudo()
|
||||
todo_record = todo_obj.browse(note_id)
|
||||
todo_record.unlink()
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
class Dataset(primary_colorDataset):
|
||||
@http.route(['/web/dataset/call_kw', '/web/dataset/call_kw/<path:path>'], type='json', auth="user")
|
||||
def call_kw(self, model, method, args, kwargs, path=None):
|
||||
if type(args) == str:
|
||||
args = literal_eval(args)
|
||||
if type(kwargs) == str:
|
||||
kwargs = literal_eval(kwargs)
|
||||
res = super(Dataset, self).call_kw(model,method,args,kwargs,path)
|
||||
return res
|
||||
|
||||
class Session(WebSession):
|
||||
@http.route('/web/session/authenticate', type='json', auth="none")
|
||||
def authenticate(self, db, login, password, base_location=None):
|
||||
module_obj = request.env['ir.module.module'].sudo().search([('name','=','spiffy_theme_backend'),('state','=','installed')])
|
||||
if module_obj:
|
||||
if request.env.context.get('color_data'):
|
||||
color_data = request.env.context.get('color_data')
|
||||
color_id = request.env.context.get('color_id')
|
||||
theme_color = request.env.context.get('theme_color')
|
||||
view_obj = request.env['ir.ui.view'].sudo().search(['|',('key','=',color_data),('key','=',theme_color)])
|
||||
if view_obj:
|
||||
view_color = view_obj.arch.find(color_id)
|
||||
if view_color == -1:
|
||||
return {
|
||||
'code':201,
|
||||
'message':'Spiffy Theme is not installed in your Odoo'
|
||||
}
|
||||
else:
|
||||
return {
|
||||
'code':201,
|
||||
'message':'Spiffy Theme is not installed in your Odoo'
|
||||
}
|
||||
else:
|
||||
return {
|
||||
'code':201,
|
||||
'message':'Spiffy Theme is not installed in your Odoo'
|
||||
}
|
||||
res = super(Session, self).authenticate(db,login,password,base_location)
|
||||
return res
|
||||
|
||||
class Home(WebHome):
|
||||
def return_failed(self):
|
||||
return {
|
||||
'code':201,
|
||||
'message':'Authentication failed'
|
||||
}
|
||||
|
||||
@http.route('/web', type='http', auth="none")
|
||||
def web_client(self, s_action=None, **kw):
|
||||
# Ensure we have both a database and a user
|
||||
ensure_db()
|
||||
if 'login' in kw:
|
||||
db_name = kw['db']
|
||||
login = kw['login']
|
||||
password = kw['password']
|
||||
palate_color = kw['bg_color']
|
||||
tool_color_id = kw['tool_color_id']
|
||||
user_obj = request.env['res.users']
|
||||
user = user_obj.search(user_obj._get_login_domain(login), order=user_obj._get_login_order(), limit=1)
|
||||
|
||||
try:
|
||||
web_session = request.session.authenticate(db_name,login,password)
|
||||
except:
|
||||
self.return_failed()
|
||||
|
||||
if palate_color:
|
||||
request.env.user.table_color = True
|
||||
else:
|
||||
request.env.user.table_color = False
|
||||
if tool_color_id:
|
||||
request.env.user.tool_color_id = tool_color_id
|
||||
if 'bg_color' in kw:
|
||||
request.env.user.table_color = True
|
||||
if 'tool_color_id' in kw:
|
||||
request.env.user.table_color = True
|
||||
|
||||
if not request.session.uid:
|
||||
return request.redirect('/web/login', 303)
|
||||
if kw.get('redirect'):
|
||||
return request.redirect(kw.get('redirect'), 303)
|
||||
if not security.check_session(request.session, request.env):
|
||||
raise http.SessionExpiredException("Session expired")
|
||||
if not is_user_internal(request.session.uid):
|
||||
return request.redirect('/web/login_successful', 303)
|
||||
|
||||
# Side-effect, refresh the session lifetime
|
||||
request.session.touch()
|
||||
# Restore the user on the environment, it was lost due to auth="none"
|
||||
request.update_env(user=request.session.uid)
|
||||
if 'bg_color' not in kw:
|
||||
request.env.user.table_color = False
|
||||
if 'tool_color_id' not in kw:
|
||||
request.env.user.tool_color_id = False
|
||||
try:
|
||||
context = request.env['ir.http'].webclient_rendering_context()
|
||||
response = request.render('web.webclient_bootstrap', qcontext=context)
|
||||
response.headers['X-Frame-Options'] = 'DENY'
|
||||
return response
|
||||
except AccessError:
|
||||
return request.redirect('/web/login?error=access')
|
||||
|
||||
|
||||
98
spiffy_theme_backend/controllers/pwa.py
Normal file
98
spiffy_theme_backend/controllers/pwa.py
Normal file
@@ -0,0 +1,98 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# See LICENSE file for full copyright and licensing details.
|
||||
# Developed by Bizople Solutions Pvt. Ltd.
|
||||
|
||||
import json
|
||||
from odoo import http
|
||||
from odoo.http import request
|
||||
|
||||
|
||||
class PwaMain(http.Controller):
|
||||
|
||||
def get_asset_urls(self, asset_xml_id):
|
||||
qweb = request.env['ir.qweb'].sudo()
|
||||
assets = qweb._get_asset_nodes(asset_xml_id, {}, True, True)
|
||||
urls = []
|
||||
for asset in assets:
|
||||
if asset[0] == 'link':
|
||||
urls.append(asset[1]['href'])
|
||||
if asset[0] == 'script':
|
||||
urls.append(asset[1]['src'])
|
||||
return urls
|
||||
|
||||
@http.route('/service_worker.js', type='http', auth="public", sitemap=False)
|
||||
def service_worker(self):
|
||||
qweb = request.env['ir.qweb'].sudo()
|
||||
company_id = request.env.company.id
|
||||
lang_code = request.env.lang
|
||||
current_lang = request.env['res.lang']._lang_get(lang_code)
|
||||
mimetype = 'text/javascript;charset=utf-8'
|
||||
content = qweb._render('spiffy_theme_backend.service_worker', {
|
||||
'company_id': company_id,
|
||||
})
|
||||
return request.make_response(content, [('Content-Type', mimetype)])
|
||||
|
||||
@http.route('/pwa/enabled', type='json', auth="public")
|
||||
def enabled_pwa(self):
|
||||
company_id = request.env.company
|
||||
if company_id.enable_pwa:
|
||||
return company_id.enable_pwa
|
||||
else:
|
||||
return False
|
||||
|
||||
@http.route('/pwa/offline', type='http', auth="public")
|
||||
def pwa_offline(self, **kw):
|
||||
return request.render('spiffy_theme_backend.pwa_offline_page',)
|
||||
|
||||
@http.route('/spiffy_theme_backend/<int:company_id>/manifest.json', type='http', auth="public")
|
||||
def manifest(self, company_id=None):
|
||||
company = request.env['res.company'].search(
|
||||
[('id', '=', company_id)]) if company_id else request.env.company
|
||||
pwashortlist = []
|
||||
app_name_pwa = company.app_name_pwa
|
||||
short_name_pwa = company.short_name_pwa
|
||||
description_pwa = company.description_pwa
|
||||
background_color_pwa = company.background_color_pwa
|
||||
theme_color_pwa = company.theme_color_pwa
|
||||
start_url_pwa = company.start_url_pwa
|
||||
image_192_pwa = "/web/image/res.company/%s/image_192_pwa/192x192" % (
|
||||
company.id)
|
||||
image_512_pwa = "/web/image/res.company/%s/image_512_pwa/512x512" % (
|
||||
company.id)
|
||||
pwa_content = {
|
||||
"name": app_name_pwa,
|
||||
"short_name": short_name_pwa,
|
||||
"icons": [{
|
||||
"sizes": "192x192",
|
||||
"src": image_192_pwa,
|
||||
"type": "image/png"
|
||||
}, {
|
||||
"sizes": "512x512",
|
||||
"src": image_512_pwa,
|
||||
"type": "image/png"
|
||||
}],
|
||||
"start_url": start_url_pwa,
|
||||
"display": "standalone",
|
||||
"scope": "/",
|
||||
"background_color": background_color_pwa,
|
||||
"theme_color": theme_color_pwa,
|
||||
|
||||
}
|
||||
if company.pwa_shortcuts_ids:
|
||||
for pwashorts in company.pwa_shortcuts_ids:
|
||||
dict = {
|
||||
"name": pwashorts.name,
|
||||
"short_name": pwashorts.short_name,
|
||||
"description": pwashorts.description,
|
||||
"url": pwashorts.url,
|
||||
"icons": [{"src": "/web/image/res.company/%s/image_192_shortcut" % (
|
||||
company.id), "sizes": "192x192"}],
|
||||
}
|
||||
pwashortlist.append(dict)
|
||||
pwa_content.update({
|
||||
"shortcuts": pwashortlist
|
||||
})
|
||||
return request.make_response(
|
||||
data=json.dumps(pwa_content),
|
||||
headers=[('Content-Type', 'application/json')]
|
||||
)
|
||||
Reference in New Issue
Block a user