summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIT Fixcomart <it@fixcomart.co.id>2024-09-06 02:32:07 +0000
committerIT Fixcomart <it@fixcomart.co.id>2024-09-06 02:32:07 +0000
commit15229196dc8fd1dab8b00cf7e0a003b9f836054d (patch)
tree5d68224e1a496c5020e1632ab2ca5794bd762c49
parent013a3e4d73327c138ede6f224b32969dc8f85c1f (diff)
parent94be2756aa2ab4c5a403877e9085eab344468f1a (diff)
Merged in update/category-management (pull request #217)
Update/category management
-rw-r--r--indoteknik_api/controllers/api_v1/category_management.py4
-rwxr-xr-xindoteknik_custom/models/__init__.py1
-rw-r--r--indoteknik_custom/models/solr/website_categories_management.py82
-rw-r--r--indoteknik_custom/models/website_categories_management.py40
-rw-r--r--indoteknik_custom/models/website_categories_management_line.py22
-rwxr-xr-xindoteknik_custom/security/ir.model.access.csv1
-rw-r--r--indoteknik_custom/views/website_categories_management.xml16
7 files changed, 103 insertions, 63 deletions
diff --git a/indoteknik_api/controllers/api_v1/category_management.py b/indoteknik_api/controllers/api_v1/category_management.py
index 836f4493..c7c4651d 100644
--- a/indoteknik_api/controllers/api_v1/category_management.py
+++ b/indoteknik_api/controllers/api_v1/category_management.py
@@ -2,11 +2,11 @@ from odoo import http
from odoo.http import request
from .. import controller
+
class CategoryManagement(controller.Controller):
prefix = '/api/v1/'
@http.route(prefix + 'categories_management', auth='public', methods=['GET', 'OPTIONS'], csrf=False)
- @controller.Controller.must_authorized()
def get_categories_management(self, **kw):
base_url = request.env['ir.config_parameter'].sudo().get_param('web.base.url')
@@ -42,5 +42,3 @@ class CategoryManagement(controller.Controller):
'categories': category_id2_data,
})
return self.response(data, headers=[('Cache-Control', 'max-age=3600, public')])
-
-
diff --git a/indoteknik_custom/models/__init__.py b/indoteknik_custom/models/__init__.py
index e9ce587c..ad7b1d09 100755
--- a/indoteknik_custom/models/__init__.py
+++ b/indoteknik_custom/models/__init__.py
@@ -39,6 +39,7 @@ from . import website_brand_homepage
from . import website_categories_homepage
from . import website_categories_lob
from . import website_categories_management
+from . import website_categories_management_line
from . import website_content
from . import website_page_content
from . import website_user_cart
diff --git a/indoteknik_custom/models/solr/website_categories_management.py b/indoteknik_custom/models/solr/website_categories_management.py
index c3851f4b..1f4caac3 100644
--- a/indoteknik_custom/models/solr/website_categories_management.py
+++ b/indoteknik_custom/models/solr/website_categories_management.py
@@ -2,19 +2,21 @@ from odoo import models, fields, api
from datetime import datetime
import json
-
class WebsiteCategoriesHomepage(models.Model):
_inherit = 'website.categories.management'
last_update_solr = fields.Datetime('Last Update Solr')
def solr(self):
+ """Returns the Solr connection object."""
return self.env['apache.solr'].connect('category_management')
def update_last_update_solr(self):
+ """Updates the last sync time for the record."""
self.last_update_solr = datetime.utcnow()
def _create_solr_queue(self, function_name):
+ """Creates unique Solr queue for each record."""
for rec in self:
self.env['apache.solr.queue'].create_unique({
'res_model': self._name,
@@ -24,26 +26,30 @@ class WebsiteCategoriesHomepage(models.Model):
@api.constrains('status')
def _create_solr_queue_sync_status(self):
+ """Triggers Solr sync when the status changes."""
self._create_solr_queue('_sync_status_category_homepage_solr')
@api.constrains('category_id', 'category_id2', 'sequence')
def _create_solr_queue_sync_category_homepage(self):
+ """Triggers Solr sync when categories or sequence change."""
self._create_solr_queue('_sync_category_management_to_solr')
def action_sync_to_solr(self):
+ """Manual action to sync selected categories to Solr."""
category_ids = self.env.context.get('active_ids', [])
categories = self.search([('id', 'in', category_ids)])
categories._create_solr_queue('_sync_category_management_to_solr')
def unlink(self):
- res = super(WebsiteCategoriesHomepage, self).unlink()
+ """Overrides unlink method to remove records from Solr."""
for rec in self:
self.solr().delete(rec.id)
self.solr().optimize()
self.solr().commit()
- return res
+ return super(WebsiteCategoriesHomepage, self).unlink()
def _sync_status_category_homepage_solr(self):
+ """Syncs status to Solr or deletes if not active."""
for rec in self:
if rec.status == 'tayang':
rec._sync_category_management_to_solr()
@@ -51,58 +57,58 @@ class WebsiteCategoriesHomepage(models.Model):
rec.unlink()
def _sync_category_management_to_solr(self):
+ """Syncs categories (Level 1, 2, and 3) to Solr."""
solr_model = self.env['apache.solr']
for category in self:
if category.status != 'tayang':
continue
- # Level 1 Document
- document = solr_model.get_doc('category_management', category.id)
- document.update({
+ # Prepare Level 1 document
+ document = {
'id': category.id,
+ 'sequence': category.sequence or '',
'category_id_i': category.category_id.id,
- 'name_s': category.category_id.name,
- 'image_s': self.env['ir.attachment'].api_image('product.public.category', 'image_1920', category.category_id.id),
- 'sequence_i': category.sequence or '',
- 'numFound_i': len(category.category_id.product_tmpl_ids.ids),
- })
-
- # Level 2 and Level 3 Documents
- level_2_docs = []
- for x in category.category_id2:
+ 'name': category.category_id.name,
+ 'numFound': len(category.category_id.product_tmpl_ids),
+ 'image': self.env['ir.attachment'].api_image(
+ 'product.public.category', 'image_1920', category.category_id.id
+ ),
+ 'categories': []
+ }
+
+ # Prepare Level 2 documents
+ for category_level_2 in category.line_ids.mapped('category_id2'):
level_2_doc = {
- 'id_level_2': x.id,
- 'name_level_2': x.name,
- 'numFound_level_2': len(x.product_tmpl_ids.ids),
- 'image_level_2': self.env['ir.attachment'].api_image('product.public.category', 'image_1920', x.id),
- 'categories_level_3': []
+ 'id_level_2': category_level_2.id,
+ 'name': category_level_2.name,
+ 'numFound': len(category_level_2.product_tmpl_ids),
+ 'image': self.env['ir.attachment'].api_image(
+ 'product.public.category', 'image_1920', category_level_2.id
+ ),
+ 'child_frontend_id_i': []
}
- # Level 3 Data
- for child in x.child_frontend_id2:
+ # Prepare Level 3 documents
+ for category_level_3 in category_level_2.child_frontend_id2:
level_3_doc = {
- 'id_level_3': child.id,
- 'name_level_3': child.name,
- 'numFound_level_3': len(child.product_tmpl_ids.ids),
- 'image_level_3': self.env['ir.attachment'].api_image('product.public.category', 'image_1920', child.id),
+ 'id_level_3': category_level_3.id,
+ 'name': category_level_3.name,
+ 'numFound': len(category_level_3.product_tmpl_ids),
+ 'image': self.env['ir.attachment'].api_image(
+ 'product.public.category', 'image_1920', category_level_3.id
+ ),
}
- level_2_doc['categories_level_3'].append(level_3_doc)
+ level_2_doc['child_frontend_id_i'].append(level_3_doc)
- level_2_docs.append(level_2_doc)
+ # Add Level 2 document to Level 1
+ document['categories'].append(level_2_doc)
- # Add level 2 documents to level 1 document
- document['categories_level_2'] = level_2_docs
-
- # Add document to Solr
+ # Sync document with Solr
self.solr().add([document])
category.update_last_update_solr()
+ # Commit and optimize Solr changes
self.solr().commit()
+ self.solr().optimize()
-
- # def _sync_delete_solr(self):
- # for rec in self:
- # self.solr().delete(rec.id)
- # self.solr().optimize()
- # self.solr().commit() \ No newline at end of file
diff --git a/indoteknik_custom/models/website_categories_management.py b/indoteknik_custom/models/website_categories_management.py
index 208b07a2..3b1db7dd 100644
--- a/indoteknik_custom/models/website_categories_management.py
+++ b/indoteknik_custom/models/website_categories_management.py
@@ -6,8 +6,12 @@ class WebsiteCategoriesManagement(models.Model):
_rec_name = 'category_id'
category_id = fields.Many2one('product.public.category', string='Category Level 1', help='table ecommerce category', domain=lambda self: self._get_default_category_domain())
- category_id2 = fields.Many2many(comodel_name='product.public.category', relation='website_categories_category_id2_rel',column1='website_categories_homepage_id', column2='product_public_category_id', string='Category Level 2', copy=False)
sequence = fields.Integer(string='Sequence')
+ category_id2 = fields.Many2many(comodel_name='product.public.category',
+ relation='website_categories_category_id2_rel',
+ column1='website_categories_homepage_id', column2='product_public_category_id',
+ string='Category Level 2', copy=False)
+ line_ids = fields.One2many('website.categories.management.line', 'management_id', string='Category Level 2 Lines', auto_join=True)
status = fields.Selection([
('tayang', 'Tayang'),
('tidak_tayang', 'Tidak Tayang')
@@ -17,11 +21,11 @@ class WebsiteCategoriesManagement(models.Model):
def _onchange_category_id(self):
domain = {}
if self.category_id != self._origin.category_id: # Check if the category_id has changed
- self.category_id2 = [(5, 0, 0)] # Clear the category_id2 field if category_id has changed
+ self.line_ids = [(5, 0, 0)] # Clear the lines if category_id has changed
if self.category_id:
- domain['category_id2'] = [('parent_frontend_id', '=', self.category_id.id)]
+ domain['line_ids'] = [('parent_frontend_id', '=', self.category_id.id)]
else:
- domain['category_id2'] = []
+ domain['line_ids'] = []
return {'domain': domain}
@@ -42,24 +46,30 @@ class WebsiteCategoriesManagement(models.Model):
def _check_category_consistency(self):
for record in self:
- category_ids = record.category_id2.ids
- for category in record.category_id2:
- for child_category in category.child_frontend_id2:
- if child_category.parent_frontend_id.id not in category_ids:
+ category_level2_ids = record.line_ids.mapped('category_id2.id') # Get all Category Level 2 IDs
+ for line in record.line_ids:
+ for category_level3 in line.category_id3_ids: # Loop through selected Category Level 3
+ if category_level3.parent_frontend_id.id not in category_level2_ids:
raise ValidationError(
- f"Category Level 3 {child_category.name} bukan bagian dari category Level 2 {category.name}")
+ f"Category Level 3 '{category_level3.name}' bukan bagian dari Category Level 2 '{line.category_id2.name}'")
def unlink(self):
- for record in self.category_id2:
- if record.id:
+ for record in self.line_ids:
+ if record.category_id2:
related_categories = self.env['product.public.category'].search([
- ('id', 'in', record.ids)
+ ('id', '=', record.category_id2.id)
])
for category in related_categories:
- for category3 in record.child_frontend_id2.ids:
- if category3 in category.child_frontend_id2.ids:
+ # Iterate through the Category Level 3 related to the current Category Level 2
+ for category3 in record.category_id3_ids:
+ # If Category Level 3 is linked to Category Level 2, remove the link
+ if category3.id in category.child_frontend_id2.ids:
category.write({
- 'child_frontend_id2': [(3, category3)]
+ 'child_frontend_id2': [(3, category3.id)]
+ # Remove the link between Category Level 2 and Category Level 3
})
+
return super(WebsiteCategoriesManagement, self).unlink()
+
+
diff --git a/indoteknik_custom/models/website_categories_management_line.py b/indoteknik_custom/models/website_categories_management_line.py
new file mode 100644
index 00000000..2f97ddfa
--- /dev/null
+++ b/indoteknik_custom/models/website_categories_management_line.py
@@ -0,0 +1,22 @@
+from odoo import fields, models, api
+from odoo.exceptions import ValidationError
+
+class WebsiteCategoriesManagementLine(models.Model):
+ _name = 'website.categories.management.line'
+ _order = 'sequence'
+
+ sequence = fields.Integer(string='Sequence')
+ management_id = fields.Many2one('website.categories.management', string='Management Reference', required=True, ondelete='cascade')
+ category_id2 = fields.Many2one('product.public.category', string='Category Level 2', required=True,)
+ category_id3_ids = fields.Many2many('product.public.category', string='Category Level 3')
+
+ @api.onchange('category_id2')
+ def _onchange_category_id2(self):
+ """ Update domain for category_id3_ids based on category_id2 """
+ if self.category_id2:
+ domain_category_id3_ids = [('parent_frontend_id', '=', self.category_id2.id)]
+ else:
+ domain_category_id3_ids = []
+
+ return {'domain': {'category_id3_ids': domain_category_id3_ids}}
+
diff --git a/indoteknik_custom/security/ir.model.access.csv b/indoteknik_custom/security/ir.model.access.csv
index 5e7554a5..09dbb45e 100755
--- a/indoteknik_custom/security/ir.model.access.csv
+++ b/indoteknik_custom/security/ir.model.access.csv
@@ -23,6 +23,7 @@ access_website_brand_homepage,access.website.brand.homepage,model_website_brand_
access_website_categories_homepage,access.website.categories.homepage,model_website_categories_homepage,,1,1,1,1
access_website_categories_lob,access.website.categories.lob,model_website_categories_lob,,1,1,1,1
access_website_categories_management,access.website.categories.management,model_website_categories_management,,1,1,1,1
+access_website_categories_management_line,access.website.categories.management.line,model_website_categories_management_line,,1,1,1,1
access_sales_target,access.sales.target,model_sales_target,,1,1,1,1
access_purchase_outstanding,access.purchase.outstanding,model_purchase_outstanding,,1,1,1,1
access_sales_outstanding,access.sales.outstanding,model_sales_outstanding,,1,1,1,1
diff --git a/indoteknik_custom/views/website_categories_management.xml b/indoteknik_custom/views/website_categories_management.xml
index 9dbe20d8..6e01e923 100644
--- a/indoteknik_custom/views/website_categories_management.xml
+++ b/indoteknik_custom/views/website_categories_management.xml
@@ -34,6 +34,15 @@
</group>
</group>
<notebook>
+ <page string="Category Level 2 Lines">
+ <field name="line_ids">
+ <tree editable="bottom">
+ <field name="category_id2" domain="[('parent_frontend_id', '=', parent.category_id)]"/> <!-- Category Level 2 -->
+ <field name="category_id3_ids" widget="many2many_tags"/> <!-- Category Level 3 -->
+ <field name="sequence" widget="handle" />
+ </tree>
+ </field>
+ </page>
<page string="Detail category">
<field name="category_id2">
<tree editable="bottom">
@@ -48,13 +57,6 @@
</field>
</record>
-<!-- <record id="ir_actions_server_website_categories_management_sync_to_solr" model="ir.actions.server">-->
-<!-- <field name="name">Sync to solr</field>-->
-<!-- <field name="model_id" ref="indoteknik_custom.model_website_categories_management"/>-->
-<!-- <field name="binding_model_id" ref="indoteknik_custom.model_website_categories_management"/>-->
-<!-- <field name="state">code</field>-->
-<!-- <field name="code">model.action_sync_to_solr()</field>-->
-<!-- </record>-->
<record id="ir_actions_server_website_categories_management_sync_to_solr" model="ir.actions.server">
<field name="name">Sync to solr</field>
<field name="model_id" ref="indoteknik_custom.model_website_categories_management"/>