from .. import controller from odoo import http from odoo.http import request from datetime import datetime class Banner(controller.Controller): prefix = '/api/v1/' @http.route(prefix + 'banner', auth='public', methods=['GET', 'OPTIONS']) @controller.Controller.must_authorized() def get_banner(self, **kw): manufacture_id = kw.get('manufacture_id') type = kw.get('type') limit = int(kw.get('limit', 0)) offset = int(kw.get('offset', 0)) order = kw.get('order', 'write_date DESC') keyword = kw.get('keyword') query = [('x_status_banner', '=', 'tayang')] if type: query += [('x_banner_category.x_studio_field_KKVl4', '=', type)] if type == 'index-a-1': order = 'group_by_week ASC, sequence ASC' if manufacture_id: query += [('x_relasi_manufacture', '=', int(manufacture_id))] banner_kumpulan = [] banner_ids = set() # Set untuk menyimpan ID banner agar tidak duplikat if keyword: keyword_list = [word.strip() for word in keyword.split() if word.strip()] # Pisahkan berdasarkan spasi for word in keyword_list: keyword_query = query + [('x_keyword_banner', 'ilike', word)] # Buat query baru dengan keyword banners = request.env['x_banner.banner'].search(keyword_query, limit=limit, offset=offset, order=order) for banner in banners: if banner.id not in banner_ids: # Pastikan tidak ada duplikasi banner_kumpulan.append(banner) banner_ids.add(banner.id) if not keyword: banners = request.env['x_banner.banner'].search(query, limit=limit, offset=offset, order=order) else: banners = banner_kumpulan if len(banner_kumpulan) > 0 else request.env['x_banner.banner'].search(query, limit=limit, offset=offset, order=order) week_number = self.get_week_number_of_current_month() end_datas = [] datas = [] for banner in banners: data = { 'name': banner.x_name, 'url': banner.x_url_banner, 'background_color': banner.background_color, 'sequence': banner.sequence, 'group_by_week': banner.group_by_week, 'image': request.env['ir.attachment'].api_image('x_banner.banner', 'x_banner_image', banner.id), 'headline_banner': banner.x_headline_banner, 'description_banner': banner.x_description_banner, 'keyword_banner': banner.x_keyword_banner } if banner.group_by_week and int(banner.group_by_week) < week_number and type == 'index-a-1': end_datas.append(data) continue datas.append(data) datas += end_datas return self.response(datas, headers=[('Cache-Control', 'max-age=3600, public')]) def get_week_number_of_current_month(self): today = datetime.now().day week_number = (today - 1) // 7 + 1 return min(week_number, 4)