You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

403 lines
18 KiB

# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Yadhukrishnan K (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
################################################################################
import base64
from collections import OrderedDict
from geopy import Nominatim
import json
import pytz
from odoo import http
from odoo.exceptions import AccessError, MissingError
from odoo.http import request, route
from odoo.tools import image_process
from odoo.tools.translate import _
from odoo.addons.portal.controllers.portal import CustomerPortal
class ReturnCustomerPortal(CustomerPortal):
"""Passing values to the sale return templates"""
def _prepare_home_portal_values(self, counters):
"""getting count of total sale returns"""
values = super()._prepare_home_portal_values(counters)
if 'return_count' in counters:
values['return_count'] = request.env['sale.return'].search_count([
('state', 'in', ['draft', 'confirm', 'done', 'cancel'])])
return values
@http.route(['/my/return_orders', '/my/return_orders/page/<int:page>'],
type='http', auth="user", website=True)
def portal_my_sale_return(self, page=1, date_begin=None, date_end=None,
sortby=None, filterby=None):
"""Passing data to the /my/return_orders page"""
values = self._prepare_portal_layout_values()
sale_return = request.env['sale.return']
domain = []
searchbar_sortings = {
'date': {'label': _('Newest'), 'order': 'create_date desc'},
'name': {'label': _('Name'), 'order': 'name'},
'sale': {'label': _('Sale Order'), 'order': 'order_id'},
}
# default sort by value
if not sortby:
sortby = 'date'
order = searchbar_sortings[sortby]['order']
if date_begin and date_end:
domain += [('create_date', '>', date_begin),
('create_date', '<=', date_end)]
searchbar_filters = {
'all': {'label': _('All'), 'domain': [
('state', 'in', ['draft', 'confirm', 'done', 'cancel'])]},
'confirm': {'label': _('Confirmed'),
'domain': [('state', '=', 'confirm')]},
'cancel': {'label': _('Cancelled'),
'domain': [('state', '=', 'cancel')]},
'done': {'label': _('Done'), 'domain': [('state', '=', 'done')]},
}
# default filter by value
if not filterby:
filterby = 'all'
domain += searchbar_filters[filterby]['domain']
# pager
pager = request.website.pager(
url="/my/return_orders",
url_args={'date_begin': date_begin, 'date_end': date_end,
'sortby': sortby},
total=sale_return.search_count(domain),
page=page,
step=self._items_per_page
)
# content according to pager and archive selected
orders = sale_return.search(domain, order=order,
limit=self._items_per_page,
offset=pager['offset'])
request.session['my_return_history'] = orders.ids[:100]
values.update({
'date': date_begin,
'orders': orders.sudo(),
'page_name': 'Sale_Return',
'default_url': '/my/return_orders',
'pager': pager,
'searchbar_filters': OrderedDict(sorted(searchbar_filters.items())),
'searchbar_sortings': searchbar_sortings,
'sortby': sortby,
})
return request.render("all_in_one_website_kit.portal_my_returns",
values)
@http.route(['/my/return_orders/<int:order_id>'], type='http',
auth="public", website=True)
def portal_my_return_detail(self, order_id=None, access_token=None,
report_type=None, download=False, **kw):
"""passing data to individual return orders"""
try:
order_sudo = self._document_check_access('sale.return', order_id,
access_token)
except (AccessError, MissingError):
return request.redirect('/my')
if report_type in ('html', 'pdf', 'text'):
return self._show_report(
model=order_sudo, report_type=report_type,
report_ref='all_in_one_website_kit.report_sale_returns',
download=download)
values = self._sale_return_get_page_view_values(order_sudo,
access_token, **kw)
return request.render("all_in_one_website_kit.portal_sale_return_page",
values)
def _sale_return_get_page_view_values(self, order, access_token, **kwargs):
""" getting values to the function portal_my_return_detail"""
def resize_to_48(b64source):
if not b64source:
b64source = request.env['ir.binary']._placeholder()
else:
b64source = base64.b64decode(b64source)
return base64.b64encode(image_process(b64source, size=(48, 48)))
values = {
'orders': order,
'resize_to_48': resize_to_48,
}
return self._get_page_view_values(order, access_token, values,
'my_return_history', False, **kwargs)
@route(['/my', '/my/home'], type='http', auth="user", website=True)
def home(self, **kw):
"""Replaces already existing work flow of portal view to redirect to
new template with record values and count"""
user = request.env.user.id
partners = request.env.user
group_id = request.env.ref('base.group_user')
order_id = request.env['sale.order'].sudo()
purchase_order = request.env['purchase.order'].sudo()
account_move = request.env['account.move']
project = request.env['project.project'].sudo()
task = request.env['project.task'].sudo()
config_parameters = request.env['ir.config_parameter'].sudo()
number_project = ""
projects_limited = ""
tasks_limited = ""
number_account = ""
invoices_limited = ""
show_project = request.env[
'ir.config_parameter'
].sudo().get_param('portal_dashboard.is_show_project')
show_account = request.env['ir.config_parameter'].sudo().get_param(
'portal_dashboard.is_show_recent_invoice_bill')
show_so_q = request.env[
'ir.config_parameter'
].sudo().get_param('portal_dashboard.is_show_recent_so_q')
show_po_rfq = request.env[
'ir.config_parameter'
].sudo().get_param('portal_dashboard.is_show_recent_po_rfq')
number_order = ""
sale_orders_limited = ""
quotations_limited = ""
number_po = ""
purchase_orders_limited = ""
rfq_limited = ""
if group_id in partners.groups_id:
if show_so_q:
number_order = request.env[
'ir.config_parameter'
].sudo().get_param('portal_dashboard.sale_count', 0)
sale_orders_limited = order_id.search([
('user_id', '=', user),
('state', 'not in', ['draft', 'sent'])
], limit=int(number_order))
quotations_limited = order_id.search([
('user_id', '=', user),
('state', 'in', ['sent'])
], limit=int(number_order))
if show_po_rfq:
number_po = config_parameters.get_param(
'portal_dashboard.purchase_count', 0)
purchase_orders_limited = purchase_order.search([
('user_id', '=', user),
('state', 'not in', ['draft', 'sent', 'to approve'])
], limit=int(number_po))
rfq_limited = purchase_order.search([
('user_id', '=', user),
('state', 'in', ['draft', 'sent', 'to approve'])
], limit=int(number_po))
if show_project:
number_project = config_parameters.get_param(
'portal_dashboard.project_count', 0)
projects_limited = project.search([],
limit=int(number_project))
tasks_limited = task.search([], limit=int(number_project))
if show_account:
number_account = config_parameters.get_param(
'portal_dashboard.account_count', 0)
invoices_limited = account_move.search([
('invoice_user_id', '=', user),
('state', 'not in', ['draft', 'cancel'])
], limit=int(number_account))
sale_orders = order_id.search([
('user_id', '=', user),
('access_token', '!=', False),
('state', 'not in', ['draft', 'sent'])
])
quotations = order_id.search([
('user_id', '=', user),
('state', 'in', ['sent'])
])
purchase_orders = purchase_order.search([
('user_id', '=', user),
('state', 'not in', ['draft', 'sent', 'to approve'])
])
rfq = purchase_order.search([
('user_id', '=', user), ('state', 'in', ['sent', 'to approve'])
])
projects = project.search([])
tasks = task.search([])
invoices = account_move.search([('access_token', '!=', False)])
else:
if show_so_q:
number_order = config_parameters.get_param(
'portal_dashboard.sale_count', 0)
sale_orders_limited = order_id.search([
('partner_id', '=', partners.partner_id.id),
('state', 'not in', ['draft', 'sent'])
], limit=int(number_order))
quotations_limited = order_id.search([
('partner_id', '=', partners.partner_id.id),
('state', 'in', ['sent'])
], limit=int(number_order))
if show_po_rfq:
number_po = config_parameters.get_param(
'portal_dashboard.purchase_count', 0)
purchase_orders_limited = purchase_order.search([
('partner_id', '=', partners.partner_id.id),
('state', 'not in', ['draft', 'sent', 'to approve'])
], limit=int(number_po))
rfq_limited = purchase_order.search([
('partner_id', '=', partners.partner_id.id),
('state', 'in', ['draft', 'sent', 'to approve'])
], limit=int(number_po))
if show_project:
number_project = config_parameters.get_param(
'portal_dashboard.project_count', 0)
projects_limited = project.search([('user_id', '=', user)],
limit=int(number_project))
tasks_limited = task.search([('user_id', '=', user)],
limit=int(number_project))
if show_account:
number_account = config_parameters.get_param(
'portal_dashboard.account_count', 0)
invoices_limited = account_move.search([
('partner_id', '=', partners.partner_id.id),
('state', 'not in', ['draft', 'cancel'])
], limit=int(number_account))
sale_orders = order_id.search([
('partner_id', '=', partners.partner_id.id),
('state', 'not in', ['draft', 'sent'])
])
quotations = order_id.search([
('partner_id', '=', partners.partner_id.id),
('state', 'in', ['sent'])
])
purchase_orders = purchase_order.search([
('partner_id', '=', partners.partner_id.id),
('state', 'not in', ['draft', 'sent', 'to approve'])
])
rfq = purchase_order.search([
('partner_id', '=', partners.partner_id.id),
('state', 'in', ['sent', 'to approve'])
])
projects = project.search([
('user_id', '=', user)
])
tasks = task.search([('user_id', '=', user)])
invoices = account_move.search([
('access_token', '!=', False)
])
values = self._prepare_portal_layout_values()
values['sale_order_portal'] = sale_orders
values['quotation_portal'] = quotations
values['purchase_orders_portal'] = purchase_orders
values['rfq_portal'] = rfq
values['projects_portal'] = projects
values['tasks_portal'] = tasks
values['invoices_portal'] = invoices
values['number_so_portal'] = number_order
values['number_po_portal'] = number_po
values['number_account_portal'] = number_account
values['number_project_portal'] = number_project
values['sale_orders_limited'] = sale_orders_limited
values['quotations_limited'] = quotations_limited
values['purchase_orders_limited'] = purchase_orders_limited
values['rfq_limited'] = rfq_limited
values['invoices_limited'] = invoices_limited
values['projects_limited'] = projects_limited
values['tasks_limited'] = tasks_limited
values['show_so_q'] = show_so_q
values['show_po_rfq'] = show_po_rfq
values['show_project'] = show_project
values['show_account'] = show_account
values['count_return_order'] = request.env['sale.return'].search_count(
[('user_id', '=', request.env.uid)])
return request.render(
"all_in_one_website_kit.replace_dashboard_portal_view",
values)
@route()
def account(self, **post):
""" Super CustomerPortal class function and pass the api key value
from settings using params to website view file"""
res = super(ReturnCustomerPortal, self).account(**post)
params = request.env['ir.config_parameter'].sudo()
values = params.get_param('base_geolocalize.google_map_api_key')
res.qcontext.update({
'api': values
})
return res
@http.route(['/geo/change/<coordinates>'], type='json', auth="none",
website=False, csrf=False)
def geo_changer(self, coordinates):
"""Controller function for get address details from latitude and
longitude that we pinpointed in map using geopy package from python
Parameters ---------- coordinates :The stringify value from map that
contains latitude and longitude
Returns ------- Returning the address details back to view file from
the converted Latitude and longitude
"""
res = json.loads(coordinates)
geolocator = Nominatim(user_agent="geoapiExercises")
location = geolocator.reverse(
str(res.get('lat')) + "," + str(res.get('lng')))
city = "Undefined"
suburb = "Undefined"
state = "Undefined"
country = "Undefined"
p_code = "Undefined"
if location:
addresses = location.raw['address']
if addresses.get('village'):
city = addresses.get('village')
if addresses.get('suburb'):
suburb = addresses.get('suburb')
state = addresses.get('state')
country_code = addresses.get('country_code')
country = pytz.country_names[country_code]
if addresses.get('postcode'):
p_code = addresses.get('postcode')
return {
'city': city,
'suburb': suburb,
'state': state,
'country': country,
'p_code': p_code,
}
@http.route(['/geo/location/<address>'], type='json', auth="none",
website=False, csrf=False)
def geo_location(self, address):
""" Get value from city field in 'my_account' page and convert into
lat and long and return back to website and set the map and fields
Parameters ---------- address : The city name that in city field in
website
Returns
-------
Pass the value to website view and set required fields and map
"""
locator = Nominatim(user_agent="myGeocoder")
location = locator.geocode(address)
geolocator = Nominatim(user_agent="geoapiExercises")
location_country = geolocator.reverse(
str(location.latitude) + "," + str(location.longitude))
addresses = location_country.raw['address']
country_code = addresses.get('country_code')
country = pytz.country_names[country_code]
p_code = "undefined"
if addresses.get('postcode'):
p_code = addresses.get('postcode')
return {
'lat': location.latitude,
'lng': location.longitude,
'country': country,
'p_code': p_code
}