1353 lines
		
	
	
		
			60 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
			
		
		
	
	
			1353 lines
		
	
	
		
			60 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
| # -*- coding: utf-8 -*-
 | |
| ##########################################################################
 | |
| #
 | |
| #    Copyright (c) 2015-Present Webkul Software Pvt. Ltd. (<https://webkul.com/>)
 | |
| #
 | |
| ##########################################################################
 | |
| from ast import literal_eval
 | |
| from odoo import api, fields, models, _, SUPERUSER_ID
 | |
| from odoo.tools.translate import html_translate
 | |
| # import datetime
 | |
| from odoo.exceptions import UserError
 | |
| import random
 | |
| import string
 | |
| import inspect
 | |
| import json
 | |
| from .fcmAPI import FCMAPI
 | |
| from datetime import datetime, timedelta
 | |
| import logging
 | |
| _logger = logging.getLogger(__name__)
 | |
| from odoo.addons.base.ir.ir_mail_server import MailDeliveryException
 | |
| 
 | |
| def _displayWithCurrency(lang_obj, amount, symbol, position):
 | |
|     fmt = "%.{0}f".format(2) # currency.decimal_places
 | |
|     # lang = cls.env['res.lang']._lang_get(cls.env.context.get('lang') or 'en_US')
 | |
| 
 | |
|     formatted_amount = lang_obj.format(fmt, amount , grouping=True, monetary=True) # currency.round(amount)
 | |
|     # _logger.info("-------%s"%formatted_amount)
 | |
|     return "%s%s"%(symbol,formatted_amount) if position=="before" else "%s%s"%(formatted_amount,symbol)
 | |
| 
 | |
| 
 | |
| @api.model
 | |
| def _lang_get(cls):
 | |
|     return cls.env['res.lang'].get_installed()
 | |
| 
 | |
| def _default_unique_key(size, chars=string.ascii_uppercase + string.digits):
 | |
|     return ''.join(random.choice(chars) for x in range(size))
 | |
| 
 | |
| def _get_image_url(base_url, model_name, record_id, field_name, width=0, height=0):
 | |
|     """ Returns a local url that points to the image field of a given browse record. """
 | |
|     if base_url and not base_url.endswith("/"):
 | |
|         base_url = base_url+"/"
 | |
|     if width or height:
 | |
|         return '%sweb/image/%s/%s/%s/%sx%s'% (base_url, model_name, record_id, field_name, width, height)
 | |
|     else:
 | |
|         return '%sweb/image/%s/%s/%s'% (base_url, model_name, record_id, field_name)
 | |
| 
 | |
| def _getProductData(p_data, base_url, currency_symbol, currency_position, lang_obj):
 | |
|     result = []
 | |
|     for prod in p_data:
 | |
|         result.append({
 | |
|             'templateId'    :prod['id'] or '',
 | |
|             'name'          :prod['name'] or '',
 | |
|             'priceUnit'     :_displayWithCurrency(lang_obj, prod['lst_price'] or 0, currency_symbol, currency_position),
 | |
|             'priceReduce'   :prod['price'] < prod['lst_price'] and _displayWithCurrency(lang_obj, prod['price'] or 0, currency_symbol, currency_position) or "",
 | |
|             'productId'     :prod['product_variant_id'] and prod['product_variant_id'][0] or '',
 | |
|             'productCount'  :prod['product_variant_count'] or 0,
 | |
|             'description'   :prod['description_sale'] or '',
 | |
|             'thumbNail'     :_get_image_url(base_url, 'product.template', prod['id'],'image')
 | |
|             })
 | |
|     return result
 | |
| 
 | |
| def _get_product_fields():
 | |
|     return ['name','product_variant_id','product_variant_count','price','description_sale','lst_price','website_price']
 | |
| 
 | |
| def _get_product_domain():
 | |
|     return [("sale_ok", "=", True), ("is_mobikul_available", "=", True)]
 | |
| 
 | |
| # def authenticate_request(fn):
 | |
| #   def ret_fn(*args, **kwargs):
 | |
| #       # userdata = inspect.getargspec(fn)
 | |
| #       # result = args[0].authenticate(args[1].get('usr'),args[1].get('pwd'))
 | |
| #       return "result %r %r"%(str(args), str(kwargs))
 | |
| #       if not result['success']:
 | |
| #           return "result %r %r "%(args, kwargs)
 | |
| #       else:
 | |
| #           return fn(*args,**kwargs)
 | |
| #   return ret_fn
 | |
| 
 | |
| 
 | |
| class Mobikul(models.Model):
 | |
|     _name = "mobikul"
 | |
|     _description = "Mobikul Model"
 | |
| 
 | |
|     @api.model
 | |
|     def _create_so(self, partner, local):
 | |
|         local = local or {}
 | |
|         result = {"success":True}
 | |
|         addr = partner.address_get(['delivery'])
 | |
|         so_data = {
 | |
|             'partner_id': partner.id,
 | |
|             'pricelist_id': self._context.get('pricelist'),
 | |
|             'payment_term_id': partner.property_payment_term_id.id,
 | |
|             'team_id': local.get("teamId"),
 | |
|             'partner_invoice_id': partner.id,
 | |
|             'partner_shipping_id': addr['delivery'],
 | |
|             'user_id': local.get("salespersonId"),
 | |
|         }
 | |
|         company = self.env['product.pricelist'].browse(self._context.get('pricelist')).sudo().company_id
 | |
|         if company:
 | |
|             so_data['company_id'] = company.id
 | |
|         result['order'] = self.env['sale.order'].sudo().create(so_data)
 | |
| 
 | |
|         partner.write({'last_website_so_id': result['order'].id})
 | |
|         result['cartId']=result['order'].id
 | |
| 
 | |
|         return result
 | |
| 
 | |
|     @api.model
 | |
|     def _create_so_line(self, order, Product, qty=1):
 | |
|         result = {"success":True}
 | |
|         SaleOrderLineSudo = self.env['sale.order.line'].sudo()
 | |
| 
 | |
|         product_context = dict(self.env.context)
 | |
|         product_context.setdefault('lang', order.partner_id.lang)
 | |
|         product_context.update({
 | |
|             'partner': order.partner_id.id,
 | |
|             'quantity': qty,
 | |
|             'date': order.date_order,
 | |
|             'pricelist': order.pricelist_id.id,
 | |
|         })
 | |
|         product = Product.with_context(product_context)
 | |
| 
 | |
|         so_line_data = {
 | |
|             'name':product.name,
 | |
|             'product_id': product.id,
 | |
|             'product_uom_qty': qty,
 | |
|             'order_id': order.id,
 | |
|             'product_uom': product.uom_id.id,
 | |
|             'price_unit': product.price,
 | |
|         }
 | |
|         order_line = SaleOrderLineSudo.create(so_line_data)
 | |
|         order_line.product_id_change()
 | |
|         order_line.product_uom_change()
 | |
|         order_line._onchange_discount()
 | |
|         return result
 | |
| 
 | |
| 
 | |
|     # @api.multi
 | |
|     # def _get_line_description(self, order, product_id, attributes=None):
 | |
|     #   if not attributes:
 | |
|     #       attributes = {}
 | |
| 
 | |
|     #   product = self.env['product.product'].with_context(product_context).browse(product_id)
 | |
| 
 | |
|     #   name = product.display_name
 | |
| 
 | |
|     #   # add untracked attributes in the name
 | |
|     #   untracked_attributes = []
 | |
|     #   for k, v in attributes.items():
 | |
|     #       # attribute should be like 'attribute-48-1' where 48 is the product_id, 1 is the attribute_id and v is the attribute value
 | |
|     #       attribute_value = self.env['product.attribute.value'].sudo().browse(int(v))
 | |
|     #       if attribute_value and not attribute_value.attribute_id.create_variant:
 | |
|     #           untracked_attributes.append(attribute_value.name)
 | |
|     #   if untracked_attributes:
 | |
|     #       name += '\n%s' % (', '.join(untracked_attributes))
 | |
| 
 | |
|     #   if product.description_sale:
 | |
|     #       name += '\n%s' % (product.description_sale)
 | |
| 
 | |
|     #   return name
 | |
| 
 | |
|     @api.model
 | |
|     def _validate(self, api_key,context=None):
 | |
|         context = context or {}
 | |
|         response = {'success':False, 'responseCode':0, 'message':_('Unknown Error !!!')}
 | |
|         if not api_key:
 | |
|             response['message'] = _('Invalid/Missing Api Key !!!')
 | |
|             return response
 | |
|         try:
 | |
|             # Get Mobikul Conf
 | |
|             mobikul = self.env['mobikul'].sudo().search([], limit=1)
 | |
|             if not mobikul:
 | |
|                 response['responseCode'] = 1
 | |
|                 response['message'] = _("Mobikul Configuration not found !!!")
 | |
|             elif mobikul.api_key != api_key:
 | |
|                 response['responseCode'] = 1
 | |
|                 response['message'] = _("API Key is invalid !!!")
 | |
|             else:
 | |
|                 response['success'] = True
 | |
|                 response['responseCode'] = 2
 | |
|                 response['message'] = _('Login successfully.')
 | |
|                 response['lang'] = context.get('lang') or mobikul.default_lang and mobikul.default_lang.code or "en_US"
 | |
|                 response['itemsPerPage'] = mobikul.product_limit
 | |
|                 response['pricelist'] = mobikul.pricelist_id and mobikul.pricelist_id.id or 1
 | |
|                 response['local'] = {
 | |
|                 'currencySymbol':mobikul.pricelist_id and mobikul.pricelist_id.currency_id and mobikul.pricelist_id.currency_id.symbol or "",
 | |
|                 'currencyPosition':mobikul.pricelist_id and mobikul.pricelist_id.currency_id and mobikul.pricelist_id.currency_id.position or "",
 | |
|                 'teamId':mobikul.salesteam_id and mobikul.salesteam_id.id or False,
 | |
|                 'salespersonId':mobikul.salesperson_id and mobikul.salesperson_id.id or False,
 | |
|                 'lang_obj':self.env['res.lang']._lang_get(response['lang'])
 | |
|                 }
 | |
|                 response['addons'] = self.check_mobikul_addons()
 | |
|         except Exception as e:
 | |
|             response['responseCode'] = 3
 | |
|             response['message'] = _("Login Failed:")+"%r"%e.message or e.name
 | |
|         return response
 | |
| 
 | |
|     @api.model
 | |
|     def _get_image_url(self, model_name, record_id, field_name, width=0, height=0, context=None):
 | |
|         """ Returns a local url that points to the image field of a given browse record. """
 | |
|         context = context or {}
 | |
|         if context.get('base_url',"") and not context['base_url'].endswith("/"):
 | |
|             context['base_url'] = context['base_url'] + "/"
 | |
|         if width or height:
 | |
|             return '%sweb/image/%s/%s/%s/%sx%s'% (context.get('base_url'), model_name, record_id, field_name, width, height)
 | |
|         else:
 | |
|             return '%sweb/image/%s/%s/%s'% (context.get('base_url'), model_name, record_id, field_name)
 | |
| 
 | |
|     @api.model
 | |
|     def _get_cat_info(self, categ_obj, context=None):
 | |
|         context = context or {}
 | |
|         cat_data = {
 | |
|         "category_id":categ_obj.id,
 | |
|         "name":categ_obj.name or "",
 | |
|         "children":[],
 | |
|         "banner":self._get_image_url('mobikul.category',categ_obj.id,'banner', context=context),
 | |
|         "icon":self._get_image_url('mobikul.category',categ_obj.id,'icon', context=context),
 | |
|         }
 | |
|         return cat_data
 | |
| 
 | |
|     @api.model
 | |
|     def _recursive_cats(self, categ_obj, context=None):
 | |
|         context = context or {}
 | |
|         data = self._get_cat_info(categ_obj, context)
 | |
|         if categ_obj.child_id:
 | |
|             for cat_child in categ_obj.child_id:
 | |
|                 data['children'].append(self._recursive_cats(cat_child, context))
 | |
|         return data
 | |
| 
 | |
|     @api.model
 | |
|     def fetch_categories(self, context=None):
 | |
|         context = context or {}
 | |
|         all_cats = []
 | |
|         if context.get('website_category',False):
 | |
|             return all_cats
 | |
|         else:
 | |
|             cat_obj = self.env['mobikul.category'].sudo()
 | |
|         top_cats = cat_obj.search([('parent_id','=',False)])
 | |
|         for top_cat in top_cats:
 | |
|             all_cats.append(self._recursive_cats(top_cat, context))
 | |
|         return all_cats
 | |
| 
 | |
|     @api.model
 | |
|     def fetch_featured_categories(self, context=None):
 | |
|         context = context or {}
 | |
|         all_fcats = []
 | |
|         if context.get('website_category',False):
 | |
|             return all_fcats
 | |
|         else:
 | |
|             cat_obj = self.env['mobikul.category'].sudo()
 | |
|         f_cats = cat_obj.search([('type','=','featured')])
 | |
| 
 | |
|         for f_cat in f_cats:
 | |
|             temp_f = {
 | |
|             'categoryName':f_cat.name or "",
 | |
|             'categoryId':f_cat.id
 | |
|             }
 | |
|             temp_f['url'] = self._get_image_url('mobikul.category',f_cat.id,'icon', context=context)
 | |
|             all_fcats.append(temp_f)
 | |
|         return all_fcats
 | |
| 
 | |
|     @api.model
 | |
|     def fetch_product_sliders(self,context=None):
 | |
|         context = context or {}
 | |
|         allProductSliders = []
 | |
|         pSlider_obj = self.env['mobikul.product.slider'].sudo()
 | |
|         p_sliders = pSlider_obj.search([])
 | |
|         for p_slider in p_sliders:
 | |
|             products = p_slider.get_product_data(context)['products']
 | |
|             if not len(products):
 | |
|                 continue
 | |
|             temp_s = {
 | |
|                 'title':p_slider.name or "",
 | |
|                 'item_display_limit':p_slider.item_display_limit,
 | |
|                 'slider_mode':p_slider.slider_mode or "",
 | |
|                 'product_img_position':p_slider.product_img_position or "",
 | |
|                 'products':products,
 | |
|                 'url':"/mobikul/sliderProducts/%d"%p_slider.id,
 | |
|                # 'color':p_slider.bk_color or ""
 | |
|             }
 | |
|             if p_slider.display_banner:
 | |
|                 temp_s['backImage'] = self._get_image_url('mobikul.product.slider',p_slider.id,'banner', context=context)
 | |
|             allProductSliders.append(temp_s)
 | |
|         return allProductSliders
 | |
| 
 | |
|     @api.model
 | |
|     def fetch_user_info(self, user_obj, context=None):
 | |
|         context = context or {}
 | |
|         temp_i = {
 | |
|         'customerBannerImage': self._get_image_url('res.partner',user_obj.partner_id.id,'banner_image', context=context),
 | |
|         'customerProfileImage': self._get_image_url('res.partner',user_obj.partner_id.id,'image', context=context),
 | |
|         'cartId': user_obj.partner_id.last_website_so_id and user_obj.partner_id.last_website_so_id.id or '',
 | |
|         # 'cartCount': user_obj.partner_id.last_website_so_id and user_obj.partner_id.last_website_so_id.cart_count or 0,
 | |
|         'themeCode': '?',
 | |
|         'customerName': user_obj.partner_id.name or "",
 | |
|         'customerEmail': user_obj.login or "",
 | |
|         'customerLang': user_obj.partner_id.lang.split('_')[0],
 | |
|         }
 | |
|         # if context.has_key('website') and context['website']:
 | |
|         #   temp_i['cartId'] = user_obj.partner_id.last_website_so_id and user_obj.partner_id.last_website_so_id.id or ''
 | |
|         #   temp_i['cartCount'] = user_obj.partner_id.last_website_so_id and user_obj.partner_id.last_website_so_id.cart_count or 0
 | |
|         # else:
 | |
|         #   temp_i['cartId'] = user_obj.partner_id.last_mobikul_so_id and user_obj.partner_id.last_mobikul_so_id.id or ''
 | |
|         #   temp_i['cartCount'] = user_obj.partner_id.last_mobikul_so_id and user_obj.partner_id.last_mobikul_so_id.cart_count or 0
 | |
|         return temp_i
 | |
| 
 | |
|     @api.model
 | |
|     def authenticate(self, credentials, detailed = False, isSocialLogin=False, context=None):
 | |
|         context = context or {}
 | |
|         response = {'success':False, 'responseCode':0, 'message':_('Unknown Error !!!')}
 | |
|         user = False
 | |
|         if not isinstance(credentials, dict):
 | |
|             response['message'] = _('Data is not in Dictionary format !!!')
 | |
|             return response
 | |
|         if isSocialLogin:
 | |
|             if not all(k in credentials for k in ('authProvider','authUserId')):
 | |
|                 response['message'] = _('Insufficient data to authenticate !!!')
 | |
|                 return response
 | |
|             provider = self._getAuthProvider(credentials['authProvider'])
 | |
|             try:
 | |
|                 user = self.env['res.users'].sudo().search([('oauth_uid', '=', credentials['authUserId']),('oauth_provider_id', '=', provider)])
 | |
|                 if not user:
 | |
|                     response['responseCode'] = 1
 | |
|                     response['message'] = _("Social-Login: No such record found.")
 | |
|             except Exception as e:
 | |
|                 response['responseCode'] = 3
 | |
|                 response['message'] = _("Social-Login Failed.")
 | |
|                 response['details'] = "%r"%e
 | |
|         else:
 | |
|             if not all(k in credentials for k in ('login','pwd')):
 | |
|                 response['message'] = _('Insufficient data to authenticate !!!')
 | |
|                 return response
 | |
|             try:
 | |
|                 user = self.env['res.users'].sudo().search([('login', '=', credentials['login'])])
 | |
|                 if user:
 | |
|                     user.sudo(user.id).check_credentials(credentials['pwd'])
 | |
|                 else:
 | |
|                     response['responseCode'] = 1
 | |
|                     response['message'] = _("Invalid email address.")
 | |
|             except Exception as e:
 | |
|                 user = False
 | |
|                 response['responseCode'] = 3
 | |
|                 response['message'] = _("Login Failed.")
 | |
|                 response['details'] = "%r"%e
 | |
|         if user:
 | |
|             try:
 | |
|                 response['success'] = True
 | |
|                 response['responseCode'] = 2
 | |
|                 response['customerId'] = user.partner_id.id
 | |
|                 response['userId'] = user.id
 | |
|                 response['cartCount'] = user.partner_id.last_website_so_id and user.partner_id.last_website_so_id.cart_count or 0
 | |
|                 response['message'] = _('Login successfully.')
 | |
|                 if self.check_mobikul_addons().get('website_sale_wishlist'):
 | |
|                     response['WishlistCount'] = len(user.partner_id.wishlist_ids)
 | |
|                 if self.check_mobikul_addons().get('email_verification'):
 | |
|                     response['is_email_verified'] = user.wk_token_verified
 | |
|                 if self.check_mobikul_addons().get('odoo_marketplace'):
 | |
|                     response['is_seller'] = user.partner_id.seller
 | |
|                     if user.partner_id.seller:
 | |
|                         response['seller_state'] = self.check_seller_state(user)
 | |
|                 if detailed:
 | |
|                     response.update(self.fetch_user_info(user, context=context))
 | |
|             except Exception as e:
 | |
|                 response['responseCode'] = 3
 | |
|                 response['message'] = _("Login Failed.")
 | |
|                 response['details'] = "%r"%e
 | |
|         return response
 | |
| 
 | |
|     def check_seller_state(self,user):
 | |
|         user_groupObj = self.env['ir.model.data'].sudo()
 | |
|         user_group_ids = user.groups_id.ids
 | |
|         xml_ids = ["marketplace_seller_group","marketplace_officer_group","marketplace_manager_group"]
 | |
|         mp_state = "pending"
 | |
|         for xml_id in xml_ids:
 | |
|             if  user_groupObj.get_object_reference('odoo_marketplace', xml_id)[1] in user_group_ids:
 | |
|                 mp_state = "approved"
 | |
|                 break
 | |
|         return mp_state
 | |
| 
 | |
| 
 | |
|     def check_mobikul_addons(self):
 | |
|         result = {}
 | |
|         ir_model_obj = self.env['ir.module.module'].sudo()
 | |
|         result['website_sale_wishlist'] = ir_model_obj.search([('state', '=', 'installed'),('name', '=', 'website_sale_wishlist')]) and True or False
 | |
|         result['review'] = ir_model_obj.search([('state', '=', 'installed'),('name', '=', 'wk_review')]) and True or False
 | |
|         result['email_verification'] = ir_model_obj.search([('state', '=', 'installed'),('name', '=', 'email_verification')]) and True or False
 | |
|         result['odoo_marketplace'] = ir_model_obj.search([('state', '=', 'installed'),('name', '=', 'odoo_marketplace')]) and True or False
 | |
|         result['website_sale_delivery'] = ir_model_obj.search([('state', '=', 'installed'),('name', '=', 'website_sale_delivery')]) and True or False
 | |
|         return result
 | |
| 
 | |
|     def email_verification_defaults(self):
 | |
|         return self.env['email.verification.config'].sudo().get_values()
 | |
| 
 | |
|     def review_defaults(self):
 | |
|         return self.env['website.review.config'].sudo().get_values()
 | |
| 
 | |
|     @api.model
 | |
|     def homePage(self, cust_data, context):
 | |
|         context = context or {}
 | |
|         response = {}
 | |
| 
 | |
|         # Get base url
 | |
|         # if not context.has_key("base_url"):
 | |
|         if not 'base_url' in context:
 | |
| 
 | |
|             context['base_url'] = self.env['ir.config_parameter'].get_param('web.base.url')
 | |
| 
 | |
|         # Get Mobikul Conf
 | |
|         mobikul = self.env['mobikul'].sudo().search([], limit=1)
 | |
| 
 | |
|         # Get all Categories
 | |
|         response['categories'] = self.fetch_categories(context=context)
 | |
| 
 | |
|         # Get all Banners
 | |
|         response['bannerImages'] = self.fetch_banners(context=context)
 | |
| 
 | |
|         # Get all Featured categories
 | |
|         response['featuredCategories'] = self.fetch_featured_categories(context=context)
 | |
| 
 | |
|         #Get all Product Sliders
 | |
|         response['productSliders'] = self.fetch_product_sliders(context=context)
 | |
| 
 | |
|         return response
 | |
| 
 | |
| 
 | |
|     @api.model
 | |
|     def fetch_banners(self, context=None):
 | |
|         context = context or {}
 | |
|         all_banners = []
 | |
|         MobBanners = self.env['mobikul.banners'].sudo().search_read([])
 | |
|         for banner in MobBanners:
 | |
|             temp_d = {
 | |
|                 "bannerName": banner['name'],
 | |
|                 "bannerType": banner['banner_action'],
 | |
|                 "id": '',
 | |
|             }
 | |
|             if banner['banner_action']=="product":
 | |
|                 temp_d['id'] = banner["product_id"][0]
 | |
|             elif banner['banner_action']=="category":
 | |
|                 temp_d['id'] = banner["category_id"][0]
 | |
|             elif banner['banner_action']=="custom":
 | |
|                 temp_d['domain'] = "[('id','in',%r)]"%banner["product_ids"]
 | |
|             if banner['image']:
 | |
|                 temp_d['url'] = self._get_image_url('mobikul.banners',banner['id'],'image', context=context)
 | |
|             else:
 | |
|                 temp_d['url'] = banner['url']
 | |
|             all_banners.append(temp_d)
 | |
|         # else:
 | |
|         #   response['message'] = "No active banners found !!!"
 | |
|         #   response['error_message'] = "Create some Banners, re-verify their publishing date."
 | |
|         return all_banners
 | |
| 
 | |
|     @api.model
 | |
|     def resetPassword(self, login):
 | |
|         response = {'success':False}
 | |
|         # MobikulConfigParam = self.search_read([], limit=1)[0]
 | |
|         # if MobikulConfigParam['reset_password_enabled']:
 | |
|         try:
 | |
|             if login:
 | |
|                 self.env['res.users'].sudo().reset_password(login)
 | |
|                 response['success'] = True
 | |
|                 response['message'] = _("An email has been sent with credentials to reset your password")
 | |
|             else:
 | |
|                 response['message'] = _("No login provided.")
 | |
|         except Exception as e:
 | |
|             # response['message'] = _("There is some error occurred. Please try again after some time.")
 | |
|             response['message'] = _("Invalid Username/Email.")
 | |
|         # else:
 | |
|         #   response['message'] = "Error: Permission not granted !!!"
 | |
|         return response
 | |
| 
 | |
|     @api.model
 | |
|     def _getAuthProvider(self, provider):
 | |
|         if provider=="GMAIL":
 | |
|             google_provider = self.env.ref('auth_oauth.provider_google')
 | |
|             return google_provider and google_provider.id or False
 | |
|         elif provider=="FACEBOOK":
 | |
|             facebook_provider = self.env.ref('auth_oauth.provider_facebook')
 | |
|             return facebook_provider and facebook_provider.id or False
 | |
|         elif provider=="TWITTER":
 | |
|             twitter_provider = self.env.ref('auth_oauth.provider_twitter')
 | |
|             return twitter_provider and twitter_provider.id or False
 | |
|         return False
 | |
| 
 | |
|     @api.model
 | |
|     def _doSignup(self, data):
 | |
|         template_user_id = literal_eval(self.env['ir.config_parameter'].get_param('auth_signup.template_user_id', 'False'))
 | |
|         template_user = self.env['res.users'].browse(template_user_id)
 | |
|         if not template_user.exists(): return [False, 'Invalid template user']
 | |
| 
 | |
|         values = { key: data.get(key) for key in ('login', 'name') }
 | |
|         values['email'] = data.get('email') or values.get('login')
 | |
|         # values['lang'] = self.lang
 | |
|         values['active'] = True
 | |
|         no_invitation_mail = True
 | |
|         if data.get('isSocialLogin',False):
 | |
|             values['oauth_uid'] = data.get('authUserId',"")
 | |
|             values['oauth_access_token'] = data.get('authToken',"")
 | |
|             values['oauth_provider_id'] = self._getAuthProvider(data.get('authProvider',""))
 | |
|             values['email'] = values.get('email','provider_%s_user_%s' % (values['oauth_provider_id'], values['oauth_uid']))
 | |
|             values['password'] = data.get("password",values['oauth_uid'])
 | |
|             if self.check_mobikul_addons().get('email_verification'):
 | |
|                 values['wk_token_verified'] = True
 | |
|             if not values['oauth_uid'] or not values['oauth_provider_id'] or not values['name'] or not values['email']:
 | |
|                 return [False,"Insufficient data to authenticate."]
 | |
|         else:
 | |
|             values['password'] = data.get('password',"")
 | |
|             no_invitation_mail = values['password'] and True or False
 | |
|             if not values['name'] or not values['email']:
 | |
|                 return [False,"Insufficient data to authenticate."]
 | |
|             # if not all(values.itervalues()): return [False,"The form was not properly filled in."]
 | |
|             # if values.get('password') != data.get('confirm_password'): return [False, "Passwords do not match; please retype them."]
 | |
|         try:
 | |
|             with self.env.cr.savepoint():
 | |
|                 if self.check_mobikul_addons().get('odoo_marketplace') and data.get('is_seller'):
 | |
|                     seller_msg = self.isMarketplaceSignup(template_user,values,data)
 | |
|                     if seller_msg.get('status'):
 | |
|                         return [True, seller_msg.get('user').id, seller_msg.get('user').partner_id.id,seller_msg.get('msg')]
 | |
|                     else:
 | |
|                         return [False,_("Seller profile 'url_handler' is not unique or absent.")]
 | |
|                 else:
 | |
|                     user = template_user.with_context(no_reset_password=no_invitation_mail).copy(values)
 | |
|                     return [True, user.id, user.partner_id.id," "]
 | |
|         except Exception as e:
 | |
|             # copy may failed if asked login is not available.
 | |
|             # return [False,"Error: %r"%e]
 | |
|             return [False,_("There is some problem in creating account. Please try again later.")]
 | |
|         return [False, "Unknown Error"]
 | |
| 
 | |
|     def isMarketplaceSignup(self,template_user,values,data):
 | |
|         if data.get('url_handler') and self.checkSellerUniqueUrl(data.get('url_handler')):
 | |
|             user = template_user.with_context(no_reset_password=True).copy(values)
 | |
|             if user:
 | |
|                 self.set_marketplace_group_user(user)
 | |
|                 # user.partner_id.country = "India"
 | |
|                 user.partner_id.seller = True
 | |
|                 user.partner_id.url_handler = data.get('url_handler')
 | |
|                 user.partner_id.country_id = data.get('country_id')
 | |
|                 return {'status':True,'msg':_("Seller created successfully"),'user':user}
 | |
|             else:
 | |
|                 {"status": False, "msg": _("Something went wrong please try again.")}
 | |
|         else:
 | |
|             return {"status": False, "msg": _("Seller profile 'url_handler' is not unique or absent.")}
 | |
| 
 | |
|     def set_marketplace_group_user(self,userObj):
 | |
|         user_group_id = self.env['ir.model.data'].get_object_reference('odoo_marketplace', 'marketplace_draft_seller_group')[1]
 | |
|         groups_obj = self.env["res.groups"].browse(user_group_id)
 | |
|         if groups_obj:
 | |
|             for group_obj in groups_obj:
 | |
|                 group_obj.write({"users": [(4, userObj.id, 0)]})
 | |
|                 return True
 | |
|         else:
 | |
|             return False
 | |
| 
 | |
| 
 | |
| 
 | |
|     def checkSellerUniqueUrl(self,url):
 | |
|         if url:
 | |
|             check_url_existObj = self.env['res.partner'].sudo().search([('url_handler','=',url)],limit=1)
 | |
|             if len(check_url_existObj) == 0:
 | |
|                 return True
 | |
|             else:
 | |
|                 return False
 | |
|         else:
 | |
|             return False
 | |
| 
 | |
| 
 | |
|     @api.model
 | |
|     def signUp(self, form_data):
 | |
|         response = {'success':False}
 | |
|         # MobikulConfigParam = self.search_read([], limit=1)[0]
 | |
|         # if MobikulConfigParam['signup_enabled']:
 | |
| 
 | |
|         try:
 | |
|             if form_data.get('isSocialLogin',False):
 | |
|                 provider = self._getAuthProvider(form_data['authProvider'])
 | |
|                 user = self.env['res.users'].sudo().search([('oauth_uid', '=', form_data['authUserId']),('oauth_provider_id', '=', provider)])
 | |
|                 if user:
 | |
|                     response['success'] = True
 | |
|                     response['message'] = _("Login Successfully.")
 | |
|                     response['userId'] = user.id
 | |
|                     response['customerId'] = user.partner_id.id
 | |
|                     return response
 | |
|             if 'login' in form_data:
 | |
|                 if self.env['res.users'].sudo().search([("login", "=",form_data['login'])]):
 | |
|                     # response['message'] = _("Another user is already registered using this email address.")
 | |
|                     response['message'] = _("This mail is already registered with us. ")
 | |
| 
 | |
| 
 | |
|                 else:
 | |
|                     result = self._doSignup(form_data)
 | |
|                     if result[0]:
 | |
|                         response['success'] = True
 | |
|                         # response['message']   = "An invitation has been sent to mentioned email, please accept it and set your password to complete the registration process."
 | |
|                         # response['message']   = "A validation e-mail has been sent to your e-mail address."
 | |
|                         response['message'] = _("Created Successfully.")
 | |
|                         response['userId'] = result[1]
 | |
|                         response['customerId'] = result[2]
 | |
|                         response['seller_message'] =result[3]
 | |
|                     else:
 | |
|                         response['message'] = _("Could not create a new account: ")+"%s"%result[1]
 | |
|             else:
 | |
|                 response['message'] = _("No login provided.")
 | |
|         except Exception as e:
 | |
|             response['message'] = _("Could not create a new account.:")+" %r"%e.message or e.name
 | |
|         # else:
 | |
|         #   response['message'] = "Error: Permission not granted !!!"
 | |
|         return response
 | |
| 
 | |
|     @api.model
 | |
|     def getDefaultData(self):
 | |
|         IrConfigParam = self.env['ir.config_parameter']
 | |
|         temp = {}
 | |
|         temp['allow_resetPwd'] = literal_eval(IrConfigParam.get_param('auth_signup.reset_password', 'False'))
 | |
|         temp['allow_signup'] = literal_eval(IrConfigParam.get_param('auth_signup.allow_uninvited', 'False'))
 | |
|         temp['allow_guestCheckout'] = literal_eval(IrConfigParam.get_param('mobikul.allow_guest', 'False'))
 | |
|         temp['allow_gmailSign'] = literal_eval(IrConfigParam.get_param('mobikul.gmail_signin', 'False'))
 | |
|         temp['allow_facebookSign'] = literal_eval(IrConfigParam.get_param('mobikul.facebook_signin', 'False'))
 | |
|         temp['allow_twitterSign'] = literal_eval(IrConfigParam.get_param('mobikul.twitter_signin', 'False'))
 | |
|         data = self.check_mobikul_addons()
 | |
|         #temp['allow_module_website_wishlist'] = data.get("wishlist")
 | |
|         temp['allowShipping'] = data.get("website_sale_delivery")
 | |
|         return temp
 | |
| 
 | |
|     def _default_order_mail_template(self):
 | |
|         return self.env.ref('sale.email_template_edi_sale').id
 | |
| 
 | |
|     def fetch_products(self, **kwargs):
 | |
|         """
 | |
|         Extra Parameters: domain, limit, fields, offset, order
 | |
|         """
 | |
|         domain = _get_product_domain()
 | |
|         result = {'offset':kwargs.get('offset',0)}
 | |
|         try:
 | |
|             if 'domain' in kwargs:
 | |
|                 domain += literal_eval(kwargs['domain'])
 | |
|         except:
 | |
|             pass
 | |
|         if 'search' in kwargs:
 | |
|             for s in kwargs['search'].split(" "):
 | |
|                 domain += [('name', 'ilike', s)]
 | |
|         if 'cid' in kwargs:
 | |
|             domain += [('mobikul_categ_ids', 'child_of', int(kwargs['cid']))]
 | |
| 
 | |
|         ProductObj = self.env['product.template'].sudo()
 | |
|         result['tcount'] = ProductObj.search_count(domain)
 | |
|         product_data = ProductObj.search_read(domain, limit=kwargs.get('limit',5), offset=result["offset"], order=kwargs.get('order',0), fields=_get_product_fields())
 | |
| 
 | |
|         result['products'] = _getProductData(product_data, kwargs.get('base_url', self._get_base_url()), kwargs.get('currencySymbol'), kwargs.get('currencyPosition'), kwargs.get('lang_obj'))
 | |
|         return result
 | |
| 
 | |
|     def _get_base_url(self):
 | |
|         return self.env['ir.config_parameter'].get_param('web.base.url')
 | |
| 
 | |
|     def _default_language(self):
 | |
|         lc = self.env['ir.default'].get('res.partner', 'lang')
 | |
|         dl = self.env['res.lang'].search([('code', '=', lc)], limit=1)
 | |
|         return dl.id if dl else self.env['res.lang'].search([]).ids[0]
 | |
| 
 | |
|     def _active_languages(self):
 | |
|         return self.env['res.lang'].search([]).ids
 | |
| 
 | |
|     def add_to_cart(self,partner,product_id,set_qty,add_qty,response):
 | |
|         PartnerObj = self.env['res.partner'].sudo()
 | |
|         Partner = PartnerObj.browse(partner)
 | |
|         if Partner:
 | |
|             Product = self.env['product.product'].sudo().search([('id','=',product_id)])
 | |
|             if Product:
 | |
|                 last_order = Partner.last_website_so_id
 | |
|                 if last_order:
 | |
|                     flag = 0
 | |
|                     for line in last_order.order_line:
 | |
|                         if line.product_id == Product:
 | |
|                             if set_qty:
 | |
|                                 line.product_uom_qty = set_qty
 | |
|                                 line.product_uom_change()
 | |
|                                 line._onchange_discount()
 | |
|                                 flag = 1
 | |
|                             elif add_qty:
 | |
|                                 line.product_uom_qty+=int(add_qty)
 | |
|                                 line.product_uom_change()
 | |
|                                 line._onchange_discount()
 | |
|                                 flag = 1
 | |
|                             else:
 | |
|                                 flag = -1
 | |
|                                 result = {'message':'Insufficient data.', 'success':False}
 | |
|                     if not flag:
 | |
|                         #Create order line
 | |
|                         self._create_so_line(last_order, Product, int(add_qty))
 | |
|                         flag = True
 | |
|                     if flag==1:
 | |
|                         result = {'message':'Added Successfully.','productName':Product.display_name, 'success':True}
 | |
|                     result['cartCount'] = last_order.cart_count
 | |
|                     return result
 | |
| 
 | |
|                 else:
 | |
|                     #create Order
 | |
|                     local = response.get('local',{})
 | |
|                     res = self._create_so(Partner, local)
 | |
|                     self._create_so_line(res['order'], Product, int(add_qty))
 | |
|                     result = {'message':'Added Successfully.','cartCount':res['order'].cart_count,'productName':Product.display_name, 'success':True}
 | |
|                     return result
 | |
|             else:
 | |
|                 result = {'success':False, 'message':'Insufficient data.'}
 | |
|                 return result
 | |
|         else:
 | |
|             result = {'success':False, 'message':'Account not found !!!'}
 | |
|             return result
 | |
| 
 | |
|     def sellerDashboardData(self,seller_Obj):
 | |
|         prdObj = self.env['product.template'].sudo()
 | |
|         SaleOrderLine = self.env['sale.order.line'].sudo()
 | |
|         approved_count = prdObj.search_count([('marketplace_seller_id', '=', seller_Obj.id), ('status', '=', 'approved')])
 | |
|         pending_count = prdObj.search_count([('marketplace_seller_id', '=', seller_Obj.id), ('status', '=', 'pending')])
 | |
|         rejected_count = prdObj.search_count([('marketplace_seller_id', '=', seller_Obj.id), ('status', '=', 'rejected')])
 | |
|         new_sol_count = SaleOrderLine.search_count([('marketplace_seller_id', '=', seller_Obj.id), ('marketplace_state', '=', 'new')])
 | |
|         approved_sol_count = SaleOrderLine.search_count([('marketplace_seller_id', '=', seller_Obj.id), ('marketplace_state', '=', 'approved')])
 | |
|         shipped_sol_count = SaleOrderLine.search_count([('marketplace_seller_id', '=', seller_Obj.id), ('marketplace_state', '=', 'shipped')])
 | |
|         temp = {
 | |
|             "approved_productCount":approved_count,
 | |
|             "pending_productCount":pending_count,
 | |
|             "rejected_productCount":rejected_count,
 | |
|             "new_solCount":new_sol_count,
 | |
|             "approved_solCount":approved_sol_count,
 | |
|             "shipped_solCount":shipped_sol_count,
 | |
|             "total":{
 | |
|                 "label":"Total Amount",
 | |
|                 "value":seller_Obj.total_mp_payment
 | |
|             },
 | |
|             "balance":{
 | |
|                 "label": "Balance Amount",
 | |
|                 "value":seller_Obj.balance_mp_payment
 | |
|             },
 | |
| 
 | |
|         }
 | |
| 
 | |
|         return temp
 | |
| 
 | |
| 
 | |
|     def easy_date(self,time=False):
 | |
|         """
 | |
|         Get a datetime object or a timestamp and return a
 | |
|         easy read string like 'Just now', 'Yesterday', '3 months ago',
 | |
|         'Year ago'.
 | |
|         """
 | |
|         now = datetime.now()
 | |
|         if type(time) is str:
 | |
|             time = fields.Datetime.from_string(time)
 | |
|         if type(time) is int:
 | |
|             diff = now - datetime.fromtimestamp(time)
 | |
|         elif isinstance(time,datetime):
 | |
|             diff = now - time
 | |
|         elif not time:
 | |
|             diff = now - now
 | |
|         second_diff = diff.seconds
 | |
|         day_diff = diff.days
 | |
| 
 | |
|         if day_diff < 0:
 | |
|             return ''
 | |
| 
 | |
|         if day_diff == 0:
 | |
|             if second_diff < 10:
 | |
|                 return "just now"
 | |
|             if second_diff < 60:
 | |
|                 return str(second_diff) + " seconds ago"
 | |
|             if second_diff < 120:
 | |
|                 return "a minute ago"
 | |
|             if second_diff < 3600:
 | |
|                 return str(second_diff / 60) + " minutes ago"
 | |
|             if second_diff < 7200:
 | |
|                 return "an hour ago"
 | |
|             if second_diff < 86400:
 | |
|                 return str(second_diff / 3600) + " hours ago"
 | |
|         if day_diff == 1:
 | |
|             return "Yesterday"
 | |
|         if day_diff < 7:
 | |
|             return str(day_diff) + " days ago"
 | |
|         if day_diff < 31:
 | |
|             return str(day_diff / 7) + " weeks ago"
 | |
|         if day_diff < 365:
 | |
|             return str(day_diff / 30) + " months ago"
 | |
|         return str(day_diff / 365) + " years ago"
 | |
| 
 | |
|     def _getdefaultWebsite_id(self):
 | |
|         website_id = self.env['website'].search([], limit=1)
 | |
|         return website_id.id
 | |
| 
 | |
| 
 | |
|     name = fields.Char('Mobikul App Title', default="Mobikul App", required=1)
 | |
|     salesperson_id = fields.Many2one('res.users', string='Default Salesperson')
 | |
|     salesteam_id = fields.Many2one('crm.team', string='Default Sales Team')
 | |
|     api_key = fields.Char(string='API Secret key', default="dummySecretKey", required=1)
 | |
|     fcm_api_key = fields.Char(string='FCM Api key')
 | |
|     color_scheme = fields.Selection([
 | |
|         ('default', 'Default'),
 | |
|         ('red-green', 'Red-Green'),
 | |
|         ('light-green', 'Light Green'),
 | |
|         ('deep-purple-pink', 'Deep Purple-Pink'),
 | |
|         ('blue-orange', 'Blue Orange'),
 | |
|         ('light-blue-red', 'Light Blue-Red')],
 | |
|         string='Color Scheme', required=True,
 | |
|         default='default',
 | |
|         help="Color Options for your Mobikul App.")
 | |
|     email_verify = fields.Boolean(default=True, string='Verify Email on signUp', help="A verification email will send to the user after signup to cross-check user`s identity.")
 | |
|     default_lang = fields.Many2one('res.lang', string='Default Language', default=_default_language,
 | |
|                             help="If the selected language is loaded in the mobikul, all documents related to "
 | |
|                             "this contact will be printed in this language. If not, it will be English.")
 | |
| 
 | |
|     language_ids = fields.Many2many('res.lang', 'mobikul_lang_rel', 'mobikul_id', 'lang_id', 'Languages', default=_active_languages)
 | |
|     pricelist_id = fields.Many2one('product.pricelist', string='Default Pricelist')
 | |
|     currency_id = fields.Many2one('res.currency', related='pricelist_id.currency_id', string='Default Currency', readonly=True)
 | |
|     order_mail_template = fields.Many2one('mail.template', string='Confirmation Email', readonly=True, default=_default_order_mail_template, help="Email sent to customer at the end of the checkout process")
 | |
|     product_limit = fields.Integer(default=10, string='Limit Products per page', help='Used in Pagination', required=1)
 | |
|     website_id = fields.Many2one('website', default=_getdefaultWebsite_id,help="select website id for the app")
 | |
| 
 | |
|     @api.multi
 | |
|     def unlink(self):
 | |
|         raise UserError(_('You cannot remove/deactivate this Configuration.'))
 | |
| 
 | |
| class MobikulBanners(models.Model):
 | |
|     _name = 'mobikul.banners'
 | |
|     _description = 'Mobikul Banner Class'
 | |
|     _order = "sequence, name"
 | |
| 
 | |
|     name = fields.Char('Title', required=True, translate=True)
 | |
|     active = fields.Boolean(default=True)
 | |
|     description = fields.Text('Description', translate=True)
 | |
|     image = fields.Binary('Image', attachment=True)
 | |
|     banner_action = fields.Selection([
 | |
|         ('product', 'Open Product Page'),
 | |
|         ('category', 'Open Category Page'),
 | |
|         ('custom', 'Open Custom Collection Page'),
 | |
|         ('none', 'Do nothing')],
 | |
|         string='Action to be triggered', required=True,
 | |
|         default='none',
 | |
|         help="Define what action will be triggerred when click/touch on the banner.")
 | |
|     product_id = fields.Many2one('product.template', string='Choose Product')
 | |
|     category_id = fields.Many2one('mobikul.category', string='Choose Category')
 | |
|     product_ids = fields.Many2many('product.template', string='Choose Products')
 | |
|     url = fields.Char('Image URL', help="Static URL of Banner Image, used when banner`s image is not present.")
 | |
|     date_published = fields.Datetime('Publish Date')
 | |
|     date_expired = fields.Datetime('Expiration Date')
 | |
|     sequence = fields.Integer(default=10, help='Display order')
 | |
|     total_views = fields.Integer('Total # Views', default=0, readonly=1)
 | |
| 
 | |
| 
 | |
|     @api.model
 | |
|     def create(self, values):
 | |
|         if not values.get('image') and not values.get('url'):
 | |
|             raise UserError(_('Please upload Banner`s Image or enter Image URL'))
 | |
|         if not values.get('date_published'):
 | |
|             values['date_published'] = datetime.now()
 | |
|         return super(MobikulBanners, self).create(values)
 | |
| 
 | |
| 
 | |
|     # crone for auto inactive expire banners
 | |
|     @api.model
 | |
|     def process_inactive_mobikul_banner(self):
 | |
|         banner = self.sudo().search([])
 | |
|         inactive_MobBanners = []
 | |
|         for b in banner:
 | |
|             if b.date_expired:
 | |
|                 if fields.Date.from_string(fields.Datetime.now()) > fields.Date.from_string(b.date_expired):
 | |
|                     inactive_MobBanners.append(b)
 | |
|         for i in inactive_MobBanners:
 | |
|             i.active = False
 | |
| 
 | |
| # method to check expire banners
 | |
|     @api.model
 | |
|     def remove_expireBanners(self):
 | |
|         banner = self.sudo().search([])
 | |
|         MobBanners = []
 | |
|         for b in banner:
 | |
|             if b.date_expired:
 | |
|                 if fields.Date.from_string(fields.Datetime.now()) <= fields.Date.from_string(b.date_expired):
 | |
|                     MobBanners.append(b)
 | |
|             else:
 | |
|                 MobBanners.append(b)
 | |
|         return MobBanners
 | |
| 
 | |
| class MobikulCategory(models.Model):
 | |
|     _name = 'mobikul.category'
 | |
|     _description = 'Mobikul Category'
 | |
|     _order = "sequence, name"
 | |
| 
 | |
|     name = fields.Char(required=True, translate=True)
 | |
|     active = fields.Boolean(default=True)
 | |
|     parent_id = fields.Many2one('mobikul.category', string='Parent Category', index=True)
 | |
|     child_id = fields.One2many('mobikul.category', 'parent_id', string='Children Categories')
 | |
|     banner = fields.Binary('Banner', attachment=True)
 | |
|     icon = fields.Binary('Icon', attachment=True)
 | |
|     sequence = fields.Integer(default=10, help='Display order')
 | |
|     complete_name = fields.Char(
 | |
|         'Complete Name', compute='_compute_complete_name',
 | |
|         store=True)
 | |
|     type = fields.Selection([
 | |
|         ('featured', 'Featured Category'),
 | |
|         ('normal', 'Normal')], 'Category Type', default='normal',
 | |
|         help="A Featured category is a category that can be used ...")
 | |
|     #this field is added for mobikul category merge
 | |
|     website_cat_id = fields.Many2one('product.public.category', 'Webiste Category')
 | |
| 
 | |
|     @api.depends('name', 'parent_id.complete_name')
 | |
|     def _compute_complete_name(self):
 | |
|         for category in self:
 | |
|             if category.parent_id:
 | |
|                 category.complete_name = '%s / %s' % (category.parent_id.complete_name, category.name)
 | |
|             else:
 | |
|                 category.complete_name = category.name
 | |
| 
 | |
|     @api.constrains('parent_id')
 | |
|     def check_parent_id(self):
 | |
|         if not self._check_recursion():
 | |
|             raise ValueError(_('Error ! You cannot create recursive categories.'))
 | |
| 
 | |
|     @api.multi
 | |
|     def name_get(self):
 | |
|         res = []
 | |
|         for category in self:
 | |
|             names = [category.name]
 | |
|             parent_category = category.parent_id
 | |
|             while parent_category:
 | |
|                 names.append(parent_category.name)
 | |
|                 parent_category = parent_category.parent_id
 | |
|             res.append((category.id, ' / '.join(reversed(names))))
 | |
|         return res
 | |
| 
 | |
|     # method call from server action
 | |
|     @api.model
 | |
|     def sync_category(self):
 | |
|         action = self.env.ref('mobikul.mobikul_sync_cat_action').read()[0]
 | |
|         action['views'] = [(self.env.ref('mobikul.mobikul_sync_cat_form').id, 'form')]
 | |
|         action['context'] = self._context
 | |
|         return action
 | |
| 
 | |
|     # def _compute_products(self):
 | |
|     #   read_group_res = self.env['product.template'].read_group([('categ_id', 'in', self.ids)], ['categ_id'], ['categ_id'])
 | |
|     #   group_data = dict((data['categ_id'][0], data['categ_id_count']) for data in read_group_res)
 | |
|     #   for categ in self:
 | |
|     #       categ.product_count = group_data.get(categ.id, 0)
 | |
| 
 | |
| class MobikulSyncCategory(models.Model):
 | |
|     _name = "mobikul.sync.category"
 | |
| 
 | |
|     sync_type = fields.Selection([
 | |
|         ('name', 'Only Name'),
 | |
|         ('name_seq', 'Name and Sequence'),
 | |
|         ('name_parent', 'Name and Parent Category'),
 | |
|         ('name_parent_seq', 'Name, Parent Category and Sequence'), ], 'Sync Type', default='name_parent_seq',
 | |
|         help="Sync mobikul category on the basis of Selection")
 | |
| 
 | |
|     def show_msg_wizard(self, msg):
 | |
|         partial_id = self.env['wk.wizard.message'].create({'text': msg})
 | |
|         return {
 | |
|             'name': "Message",
 | |
|             'view_mode': 'form',
 | |
|             'view_id': False,
 | |
|             'view_type': 'form',
 | |
|             'res_model': 'wk.wizard.message',
 | |
|             'res_id': partial_id.id,
 | |
|             'type': 'ir.actions.act_window',
 | |
|             'nodestroy': True,
 | |
|             'target': 'new',
 | |
|         }
 | |
| 
 | |
|     @api.multi
 | |
|     def sync_mobikul_cat_with_web_cat(self):
 | |
|         isCatMerge = self.env['ir.module.module'].sudo().search(
 | |
|             [('state', '=', 'installed'), ('name', '=', 'mobikul_cat_merge')]) and True or False
 | |
|         if isCatMerge:
 | |
|             mobikul_catg_ids = self.env['mobikul.category'].search([("id","in",self._context.get('active_ids'))])
 | |
|             if not self.sync_type:
 | |
|                 raise UserError(_("Please select the Sync Type."))
 | |
|             for mob_cat in mobikul_catg_ids:
 | |
|                 if mob_cat.website_cat_id.id:
 | |
|                     if self.sync_type == "name":
 | |
|                         mob_cat.name = mob_cat.website_cat_id.name
 | |
|                     elif self.sync_type == "name_parent":
 | |
|                         mob_cat.name = mob_cat.website_cat_id.name
 | |
|                         mob_cat.parent_id = mob_cat.website_cat_id.parent_id.mobikul_cat_id.id
 | |
|                     elif self.sync_type == "name_parent_seq":
 | |
|                         mob_cat.name = mob_cat.website_cat_id.name
 | |
|                         mob_cat.parent_id = mob_cat.website_cat_id.parent_id.mobikul_cat_id.id
 | |
|                         mob_cat.sequence = mob_cat.website_cat_id.sequence
 | |
|                     elif self.sync_type == "name_seq":
 | |
|                         mob_cat.name = mob_cat.website_cat_id.name
 | |
|                         mob_cat.sequence = mob_cat.website_cat_id.sequence
 | |
| 
 | |
|                 else:
 | |
|                     _logger.info("MESAGE :Website category is not present in Mobikul Caegory")
 | |
|             if self.sync_type == "name":
 | |
|                 message = "Done! name are synced with mobikul category from Website category."
 | |
|             elif self.sync_type == "name_seq":
 | |
|                 message = "Done! name and sequence are synced with mobikul category from Website category."
 | |
|             elif self.sync_type == "name_parent":
 | |
|                 message = "Done! name and parent category are synced with mobikul categories from Website category."
 | |
|             elif self.sync_type == "name_parent_seq":
 | |
|                 message = "Done! name, sequence and parent category are synced with mobikul categories from Website category."
 | |
|         else:
 | |
|             message = "Install the Mobikul Category Merge Module First"
 | |
|         return self.show_msg_wizard(message)
 | |
| 
 | |
| class MobikulPushNotificationTemplate(models.Model):
 | |
|     _name = 'mobikul.push.notification.template'
 | |
|     _description = 'Mobikul Push Notification Templates'
 | |
|     _order = "name"
 | |
| 
 | |
|     def _addMe(self, data):
 | |
|         self.env["mobikul.notification.messages"].sudo().create(data)
 | |
|         return True
 | |
| 
 | |
| 
 | |
|     def _get_key(self):
 | |
|         mobikul = self.env['mobikul'].sudo().search([], limit=1)
 | |
|         return mobikul and mobikul.fcm_api_key or ""
 | |
| 
 | |
|     @api.model
 | |
|     def _pushMe(self,key, payload_data, data=False):
 | |
|         status = True
 | |
|         summary = ""
 | |
|         try:
 | |
|             push_service = FCMAPI(api_key=key)
 | |
|             summary = push_service.send([payload_data])
 | |
|             if data:
 | |
|             	self._addMe(data)
 | |
|         except Exception as e:
 | |
|             status = False
 | |
|             summary = "Error: %r"%e
 | |
|         return [status,summary]
 | |
| 
 | |
|     @api.model
 | |
|     def _send(self, to_data, customer_id=False, max_limit=20):
 | |
|         """
 | |
|         to_data = dict(to or registration_ids)
 | |
|         """
 | |
|         if type(to_data)!=dict:
 | |
|             return False
 | |
|         if not to_data.get("to",False) and not to_data.get("registration_ids",False):
 | |
|             if not customer_id:
 | |
|                 return False
 | |
|             reg_data = self.env['fcm.registered.devices'].sudo().search_read([('customer_id','=',customer_id)],limit=max_limit, fields=['token'])
 | |
|             if not reg_data:
 | |
|                 return False
 | |
|             to_data = {
 | |
|                 "registration_ids":[r['token'] for r in reg_data]
 | |
|             }
 | |
|         notification = dict(title=self.notification_title, body=self.notification_body)
 | |
|         if self.notification_color:
 | |
|             notification['color'] = self.notification_color
 | |
|         if self.notification_tag:
 | |
|             notification['tag'] = self.notification_tag
 | |
| 
 | |
|         fcm_payload = dict(notification=notification)
 | |
|         fcm_payload.update(to_data)
 | |
|         data_message = dict(type="",id="",domain="",image="",name="")
 | |
| 
 | |
|         if self.banner_action == 'product':
 | |
|             data_message['type'] = 'product'
 | |
|             data_message['id'] = self.product_id.id
 | |
|             data_message['name'] = self.product_id.name
 | |
|         elif self.banner_action == 'category':
 | |
|             data_message['type'] = 'category'
 | |
|             data_message['id'] = self.category_id.id
 | |
|             data_message['name'] = self.category_id.name
 | |
|         elif self.banner_action == 'custom':
 | |
|             data_message['type'] = 'custom'
 | |
|             data_message['domain'] = "[('id','in',%s)]"%self.product_ids.ids
 | |
|             data_message['name'] = self.notification_title
 | |
|         else:
 | |
|             data_message['type'] = 'none'
 | |
|         data_message['image'] = _get_image_url(self._context.get('base_url'), 'mobikul.push.notification.template', self.id,'image')
 | |
|         data_message['notificationId'] = random.randint(1, 99999)
 | |
|         fcm_payload['data'] = data_message
 | |
|         if customer_id:
 | |
|             data = dict(
 | |
|                    title=self.notification_title, body=self.notification_body, customer_id=customer_id,
 | |
|                    banner=self.image, datatype='default'
 | |
|                    )
 | |
|         return self._pushMe(self._get_key(), json.dumps(fcm_payload).encode('utf8'), customer_id and data or False)
 | |
| 
 | |
|     name = fields.Char('Name', required=True, translate=True)
 | |
|     notification_color = fields.Char('Color',default='PURPLE')
 | |
|     notification_tag = fields.Char('Tag')
 | |
|     notification_title = fields.Char('Title', required=True, translate=True)
 | |
|     active = fields.Boolean(default=True, copy=False)
 | |
|     notification_body = fields.Text('Body', translate=True)
 | |
|     image = fields.Binary('Image', attachment=True)
 | |
|     banner_action = fields.Selection([
 | |
|         ('product', 'Open Product Page'),
 | |
|         ('category', 'Open Category Page'),
 | |
|         ('custom', 'Open Custom Collection Page'),
 | |
|         ('none', 'Do nothing')],
 | |
|         string='Action', required=True,
 | |
|         default='none',
 | |
|         help="Define what action will be triggerred when click/touch on the banner.")
 | |
|     product_id = fields.Many2one('product.template', string='Choose Product')
 | |
|     product_ids = fields.Many2many('product.template', string='Choose Products')
 | |
|     category_id = fields.Many2one('mobikul.category', string='Choose Category')
 | |
|     device_id = fields.Many2one('fcm.registered.devices', string='Select Device')
 | |
|     total_views = fields.Integer('Total # Views', default=0, readonly=1, copy=False)
 | |
|     condition = fields.Selection([
 | |
|         ('signup', 'Customer`s SignUp'),
 | |
|         ('orderplaced',"Order Placed")
 | |
|         ], string='Condition', required=True, default='signup')
 | |
| 
 | |
|     @api.multi
 | |
|     def dry_run(self):
 | |
|         self.ensure_one()
 | |
|         to_data = dict(to=self.device_id and self.device_id.token or "")
 | |
|         result = self._send(to_data, self.device_id and self.device_id.customer_id and self.device_id.customer_id.id or False)
 | |
|         # raise UserError('Result: %r'%result)
 | |
| 
 | |
|     @api.multi
 | |
|     def copy(self, default=None):
 | |
|         self.ensure_one()
 | |
|         default = dict(default or {}, name=_('%s(copy)') % self.name)
 | |
|         return super(MobikulPushNotificationTemplate, self).copy(default)
 | |
| 
 | |
| 
 | |
| class MobikulPushNotification(models.Model):
 | |
|     _name = 'mobikul.push.notification'
 | |
|     _description = 'Mobikul Push Notification'
 | |
|     _order = "activation_date, name"
 | |
|     _inherit = ['mobikul.push.notification.template']
 | |
| 
 | |
| 
 | |
|     @api.model
 | |
|     def parse_n_push(self, max_limit=20, registration_ids=None):
 | |
|         to_data = dict()
 | |
|         if self.notification_type == 'token-auto':
 | |
|             reg_data = self.env['fcm.registered.devices'].sudo().search_read(limit=max_limit, fields=['token'])
 | |
|             registration_ids = [r['token'] for r in reg_data]
 | |
|         elif self.notification_type == 'token-manual':
 | |
|             registration_ids = [d.token for d in self.device_ids]
 | |
|         elif self.notification_type == 'topic':
 | |
|             to_data['to'] = '/topics/%s' % self.topic_id.name
 | |
|         else:
 | |
|             return [False,"Insufficient Data"]
 | |
| 
 | |
|         if registration_ids:
 | |
|             if len(registration_ids) > 1:
 | |
|                 to_data['registration_ids'] = registration_ids
 | |
|             else:
 | |
|                 to_data['to'] = registration_ids[0]
 | |
|         return self._send(to_data)
 | |
| 
 | |
|     summary = fields.Text('Summary', readonly=True)
 | |
|     activation_date = fields.Datetime('Activation Date', copy=False)
 | |
|     notification_type = fields.Selection([
 | |
|         ('token-auto', 'Token-Based(All Reg. Devices)'),
 | |
|         ('token-manual', 'Token-Based(Selected Devices)'),
 | |
|         ('topic', 'Topic-Based'),
 | |
|         ],
 | |
|         string='Type', required=True,
 | |
|         default='token-auto')
 | |
|     topic_id = fields.Many2one('fcm.registered.topics', string='Choose Topic')
 | |
|     device_ids = fields.Many2many('fcm.registered.devices', string='Choose Devices/Customers')
 | |
|     state = fields.Selection([
 | |
|         ('draft', 'Draft'),
 | |
|         ('confirm', 'Confirm'),
 | |
|         ('hold', 'Hold'),
 | |
|         ('error', 'Error'),
 | |
|         ('done', 'Done'),
 | |
|         ('cancel', 'Cancelled'),
 | |
|         ], string='Status', readonly=True, copy=False, index=True, track_visibility='onchange', default='draft')
 | |
| 
 | |
|     @api.multi
 | |
|     def action_cancel(self):
 | |
|         for record in self:
 | |
|             record.state = 'cancel'
 | |
|         return True
 | |
| 
 | |
|     @api.multi
 | |
|     def action_confirm(self):
 | |
|         for record in self:
 | |
|             record.state = 'confirm'
 | |
|         return True
 | |
| 
 | |
|     @api.multi
 | |
|     def action_draft(self):
 | |
|         for record in self:
 | |
|             record.state = 'draft'
 | |
|         return True
 | |
| 
 | |
|     @api.multi
 | |
|     def action_hold(self):
 | |
|         for record in self:
 | |
|             record.state = 'hold'
 | |
|         return True
 | |
| 
 | |
|     @api.multi
 | |
|     def push_now(self):
 | |
|         for record in self:
 | |
|             response = record.parse_n_push()
 | |
|             record.state = response[0] and 'done' or 'error'
 | |
|             record.summary = response[1]
 | |
|         return True
 | |
| 
 | |
|     @api.multi
 | |
|     def duplicate_me(self):
 | |
|         self.ensure_one()
 | |
|         action = self.env.ref('mobikul.mobikul_push_notification_action').read()[0]
 | |
|         action['views'] = [(self.env.ref('mobikul.mobikul_push_notification_view_form').id, 'form')]
 | |
|         action['res_id'] = self.copy().id
 | |
|         return action
 | |
| 
 | |
| class MobikulProductSlider(models.Model):
 | |
|     _name = 'mobikul.product.slider'
 | |
|     _description = 'Mobikul Product Slider'
 | |
|     _order = "sequence"
 | |
| 
 | |
|     @api.multi
 | |
|     def _products_count(self):
 | |
|         r = {}
 | |
|         for slider in self:
 | |
|             slider.product_count = r.get(slider.id, len(slider.get_product_data({'count':True})))
 | |
|         return r
 | |
| 
 | |
|     @api.multi
 | |
|     def action_view_products(self):
 | |
|         products = self.get_product_data({'count':True})
 | |
|         action = self.env.ref('mobikul.mobikul_product_template_action').read()[0]
 | |
|         action['domain'] = [('id', 'in', products)]
 | |
|         return action
 | |
| 
 | |
|     @api.multi
 | |
|     def get_product_data(self,context=None):
 | |
|         context=context or {}
 | |
|         if not 'base_url' in context:
 | |
|             context['base_url'] = self.env['ir.config_parameter'].get_param('web.base.url')
 | |
|         orderBy = context.get('order',None)
 | |
|         mlimit = context.get('limit',self.item_limit)
 | |
|         moffset = context.get('offset',0)
 | |
| 
 | |
|         prod_obj = self.env['product.template'].sudo()
 | |
|         product_filter = _get_product_domain()
 | |
|         if self.product_selection == "manual":
 | |
|             product_filter.append(('id','in',self.product_ids._ids))
 | |
|         elif self.product_based_on == 'new':
 | |
|             orderBy = 'id desc'
 | |
|         elif self.product_based_on == 'iCategory':
 | |
|             product_filter.append(('categ_id','=',self.icategory_id and self.icategory_id.id or False))
 | |
|         elif self.product_based_on == 'wCategory':
 | |
|             product_filter.append(('public_categ_ids','=',self.wcategory_id and self.wcategory_id.id or False))
 | |
|         elif self.product_based_on == 'mCategory':
 | |
|             product_filter.append(('mobikul_categ_ids','=',self.mcategory_id and self.mcategory_id.id or False))
 | |
|         all_prods = prod_obj.search(product_filter, order=orderBy)
 | |
|         if 'count' in context:
 | |
|             return all_prods._ids
 | |
|         else:
 | |
|             product_data = prod_obj.search_read(product_filter, limit=mlimit, fields=_get_product_fields(), offset=moffset, order=orderBy)
 | |
|         result = {'tcount':len(all_prods),'offset':moffset}
 | |
|         result['products'] = _getProductData(product_data, context.get('base_url'), context.get('currencySymbol'), context.get('currencyPosition'), context.get('lang_obj'))
 | |
|         return result
 | |
| 
 | |
|     name = fields.Char('Slider Title', required=True, translate=True)
 | |
|     active = fields.Boolean(default=True)
 | |
|     sequence = fields.Integer(default=10, help='Display order', required=True)
 | |
|     description = fields.Text('Description', translate=True)
 | |
|     display_banner = fields.Boolean('Display Banner', default=False)
 | |
|     banner = fields.Binary('Banner', attachment=True)
 | |
|     url = fields.Char('Link URL', help="Used when someone click on banner/view-all button.")
 | |
|     product_ids = fields.Many2many('product.template', string='Choose Products')
 | |
|     total_views = fields.Integer('Total # Views', default=0, readonly=1)
 | |
|     item_limit = fields.Integer('Maximum no. of products in a slider', default=5, required=True)
 | |
|     item_display_limit = fields.Integer('Display no. of Products in a slider(per row)', default=5, required=True)
 | |
|     product_img_position = fields.Selection([
 | |
|         ('center', 'Center'),
 | |
|         ('left', 'Left'),
 | |
|         ('right', 'Right'),
 | |
|         ],
 | |
|         string='Product Image Position', required=True,
 | |
|         default='center')
 | |
|     slider_mode = fields.Selection([
 | |
|         ('default', 'Default(Slide)'),
 | |
|         ('fixed', 'Fixed'),
 | |
|         ],
 | |
|         string='Slider Mode', required=True,
 | |
|         default='default',
 | |
|         help="Define which type of behaviour you want with your Slider.")
 | |
|     product_selection = fields.Selection([
 | |
|         ('manual', 'Manual'),
 | |
|         ('automatic', 'Automatic'),
 | |
|         ],
 | |
|         string='Selection Criteria', required=True, default='automatic')
 | |
|     product_based_on = fields.Selection([
 | |
|         ('new', 'Newly created'),
 | |
|         ('iCategory', 'Internal Category'),
 | |
|         ('mCategory', 'Mobikul Category'),
 | |
|         ('wCategory', 'Website Category'),
 | |
|         ],
 | |
|         string='Based on', default='new')
 | |
|     mcategory_id = fields.Many2one('mobikul.category', string='Mobikul Category')
 | |
|     wcategory_id = fields.Many2one('product.public.category', string='Website Category')
 | |
|     icategory_id = fields.Many2one('product.category', string='Internal Category')
 | |
|     product_count = fields.Integer(compute='_products_count', string='# Products')
 | |
|     bk_color = fields.Char('Background Color')
 | |
| 
 | |
| class FcmRegisteredDevices(models.Model):
 | |
|     _name = 'fcm.registered.devices'
 | |
|     _description = 'All Registered Devices on FCM for Push Notifications.'
 | |
|     _order = 'write_date desc'
 | |
| 
 | |
|     @api.multi
 | |
|     def name_get(self):
 | |
|         res = []
 | |
|         for record in self:
 | |
|             name = record.customer_id and record.customer_id.name or ''
 | |
|             res.append((record.id, "%s(DeviceId:%s)"%(name,record.device_id)))
 | |
|         return res
 | |
| 
 | |
|     name = fields.Char('Name')
 | |
|     token = fields.Text('FCM Registration ID', readonly=True)
 | |
|     device_id = fields.Char('Device Id', readonly=True)
 | |
|     customer_id = fields.Many2one('res.partner', string="Customer", readonly=True, index=True)
 | |
|     active = fields.Boolean(default=True, readonly=True)
 | |
|     # write_date = fields.Datetime(string='Last Update', readonly=True, help="Date on which this entry is created.")
 | |
|     description = fields.Text('Description', readonly=True)
 | |
| 
 | |
| class FcmRegisteredTopics(models.Model):
 | |
|     _name = 'fcm.registered.topics'
 | |
|     _description = 'All Registered Topics for Push Notifications.'
 | |
| 
 | |
|     name = fields.Char('Topic Name', required=True)
 | |
| 
 | |
| 
 | |
| 
 | |
| class MobikulNotificationMessages(models.Model):
 | |
|     _name = 'mobikul.notification.messages'
 | |
|     _description = 'Mobikul Notification Messages'
 | |
| 
 | |
|     name = fields.Char('Message Name')
 | |
|     title = fields.Char('Title')
 | |
|     subtitle = fields.Char('Subtitle')
 | |
|     body = fields.Text('Body')
 | |
|     icon = fields.Binary('Icon')
 | |
|     banner = fields.Binary('Banner')
 | |
|     is_read = fields.Boolean('Is Read',default=False, readonly=True)
 | |
|     customer_id = fields.Many2one('res.partner', string="Customer", index=True)
 | |
|     active = fields.Boolean(default=True, readonly=True)
 | |
|     period = fields.Char('Period',compute='_compute_period')
 | |
|     datatype = fields.Selection([
 | |
|         ('default', 'Default'),
 | |
|         ('order','Order')],
 | |
|         string='Data Type', required=True,
 | |
|         default='default',
 | |
|         help="Notification Messages Data Type for your Mobikul App.")
 | |
| 
 | |
| 
 | |
|     def _compute_period(self):
 | |
|         for i in self:
 | |
|             i.period = self.env['mobikul'].easy_date(i.create_date)
 |