diff --git a/s_license/s_license_module/__init__.py b/s_license/s_license_module/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..2c6678dcc7269f7b19d9b7d4a7bad1cb7bff7aea --- /dev/null +++ b/s_license/s_license_module/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +from . import models +from . import controller +from . import wizard diff --git a/s_license/s_license_module/__manifest__.py b/s_license/s_license_module/__manifest__.py new file mode 100644 index 0000000000000000000000000000000000000000..980bd930ac0f01a387dbab8b5625c773ac05b5a8 --- /dev/null +++ b/s_license/s_license_module/__manifest__.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +{ + 'name': "License", + 'summary': "License", + 'category': 'Services', + 'version': '0.1', + 'depends': ['base','mail', 'web'], + 'data': [ + 'security/ir.model.access.csv', + 'views/s_license_view/s_license_view.xml', + 'views/s_license_view/s_license_register.xml', + 'views/s_license_view/susscess.xml', + 'views/s_license_view/menu_item.xml', + 'wizard/s_license_wizard_view.xml', + ], + 'installable': True, + 'application': True, +} diff --git a/s_license/s_license_module/controller/__init__.py b/s_license/s_license_module/controller/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..9e9b01988d5742109830d90b3c5608a653b37220 --- /dev/null +++ b/s_license/s_license_module/controller/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +from . import license_controller diff --git a/s_license/s_license_module/controller/license_controller.py b/s_license/s_license_module/controller/license_controller.py new file mode 100644 index 0000000000000000000000000000000000000000..d8006e2c65568b81ba83d0af01791507f11215d4 --- /dev/null +++ b/s_license/s_license_module/controller/license_controller.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +from odoo import http +from odoo.http import request + + +class license_controller(http.Controller): + @http.route('/license', type='http', auth='public', website=True) + def home_license(self): + licenses = request.env['license.manager'].search([]) + return request.render('s_license_module.view_license_register', + {"data": licenses}) + + @http.route('/submit_license', type='http', auth='public', methods=['POST'], website=True, csrf=False) + def submit_license(self, **kwargs): + request.env['license.manager'].create(kwargs) + return request.render('s_license_module.license_success_id') diff --git a/s_license/s_license_module/models/__init__.py b/s_license/s_license_module/models/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..a9f74564a9a8a9ac95b83a15405eba831052d2e6 --- /dev/null +++ b/s_license/s_license_module/models/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +from . import s_license diff --git a/s_license/s_license_module/models/s_license.py b/s_license/s_license_module/models/s_license.py new file mode 100644 index 0000000000000000000000000000000000000000..c3c4253e83ca323102313f7eeaa4c41fa4d9fea3 --- /dev/null +++ b/s_license/s_license_module/models/s_license.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +from odoo import models, fields, api + + +class LicenseManager(models.Model): + _name = 'license.manager' + _description = 'License' + _inherit = ['mail.thread', 'mail.activity.mixin'] + + name = fields.Char("Name", tracking=True) + start_date = fields.Date('Start Date', tracking=True) + end_date = fields.Date('Start End', tracking=True) + key = fields.Char("Key", tracking=True) + note = fields.Text("Note", tracking=True) + status = fields.Selection([ + ('active', 'Active'), + ('inactive', 'Inactive'), + ('pending', 'Pending'), + ('cancel', 'Cancel') + ], string='Status', default='pending', tracking=True) + + def popup_note(self): + form_view_id = self.env.ref('s_license_module.form_pop_input_note_id').id + return { + 'name': ('Note'), + 'res_model': 'license.popup', + 'view_mode': 'form', + 'target': 'new', + 'type': 'ir.actions.act_window', + 'views': [(form_view_id, 'form')]} + + @api.constrains('name', 'start_date', 'end_date', 'key') + def update_status(self): + status = "pending" + self.status = status + self.env["license.manager"].write(self) diff --git a/s_license/s_license_module/security/ir.model.access.csv b/s_license/s_license_module/security/ir.model.access.csv new file mode 100644 index 0000000000000000000000000000000000000000..56df68e9f5821cc695c81cc98009fb257e229420 --- /dev/null +++ b/s_license/s_license_module/security/ir.model.access.csv @@ -0,0 +1,2 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_abc_manager,abc manager,model_license_manager,,1,1,1,1 diff --git a/s_license/s_license_module/static/src/css/license_css.css b/s_license/s_license_module/static/src/css/license_css.css new file mode 100644 index 0000000000000000000000000000000000000000..e0900ed1093edd5b167c887047da5368a76703c5 --- /dev/null +++ b/s_license/s_license_module/static/src/css/license_css.css @@ -0,0 +1,36 @@ +.table-container { + width: 100%; + margin: 20px 0; + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); +} + +.license-table { + width: 100%; + border-collapse: collapse; + margin-top: 20px; +} + +.license-table thead { + background-color: #343a40; + color: #ffffff; +} + +.license-table th, +.license-table td { + padding: 12px 15px; + text-align: left; + border-bottom: 1px solid #dddddd; +} + +.license-table tr:nth-child(even) { + background-color: #f2f2f2; +} + +.license-table tr:hover { + background-color: #f1f1f1; +} + +.license-table th { + background-color: #007bff; + color: white; +} diff --git a/s_license/s_license_module/static/src/css/s_license_view.css b/s_license/s_license_module/static/src/css/s_license_view.css new file mode 100644 index 0000000000000000000000000000000000000000..9715cc16b15334cb52a3b4a4a8e1e9281fbe7346 --- /dev/null +++ b/s_license/s_license_module/static/src/css/s_license_view.css @@ -0,0 +1,3 @@ +.custome_button_license{ + background-color: red; +} diff --git a/s_license/s_license_module/views/s_license_view/menu_item.xml b/s_license/s_license_module/views/s_license_view/menu_item.xml new file mode 100644 index 0000000000000000000000000000000000000000..eea465c9cfd31212e02f2e2538029760b3c6521b --- /dev/null +++ b/s_license/s_license_module/views/s_license_view/menu_item.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<odoo> + <menuitem id="menu_license_root" name="license" sequence="10"/> + <menuitem id="menu_license" name="license" parent="menu_license_root" action="action_license" sequence="10"/> +</odoo> diff --git a/s_license/s_license_module/views/s_license_view/s_license_register.xml b/s_license/s_license_module/views/s_license_view/s_license_register.xml new file mode 100644 index 0000000000000000000000000000000000000000..c65db94a24e9bcbc2107828b05ee4a55b8f05e80 --- /dev/null +++ b/s_license/s_license_module/views/s_license_view/s_license_register.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="UTF-8"?> + <odoo> + <template id="view_license_register"> + <div class="container"> + <h1>REGISTER LICENSE</h1> + <form action = "/submit_license" method = "POST"> + <div class="form-group"> + <label for="lastName">Start date</label> + <input type="date" id="start_date" name="start_date" placeholder="Enter start date" required="True"/> + </div> + <div class="form-group"> + <label for="company">End date</label> + <input type="date" id="end_date" name="end_date" placeholder="Enter End date" required="True"/> + </div> + <div class="form-group"> + <label for="email">UUID</label> + <input type="text" id="key" name="key" placeholder="Enter UUID" required="True"/> + </div> + <button type="submit" class="submit-btn">Register</button> + </form> + </div> + </template> + <data> + <template id="assets_backend" name="My Styles" inherit_id = 'view_license_register'> + <xpath expr="." position="inside"> + <link href="/s_license_module/static/src/css/license_css.css" rel="stylesheet" type="text/css"/> + </xpath> + </template> + </data> + </odoo> diff --git a/s_license/s_license_module/views/s_license_view/s_license_view.xml b/s_license/s_license_module/views/s_license_view/s_license_view.xml new file mode 100644 index 0000000000000000000000000000000000000000..10a85639f099c580d5671ee79a6b895b7df97ea5 --- /dev/null +++ b/s_license/s_license_module/views/s_license_view/s_license_view.xml @@ -0,0 +1,113 @@ +<?xml version="1.0" encoding="UTF-8"?> +<odoo> + <record id="view_form_license" model="ir.ui.view"> + <field name="name">license.manager.form</field> + <field name="model">license.manager</field> + <field name="arch" type="xml"> + <form string="license Form"> + <header attrs="{'invisible': [('id', '=', False)]}"> + <button name="popup_note" string="Active" type="object" class="oe_button oe_highlight" + context="{'button_info': 'active', 'id_license' : active_id}" + attrs="{'invisible' : [('status', '!=', 'pending')]}"/> + <button name="popup_note" string="Cancel" type="object" class="oe_button oe_highlight" + context="{'button_info': 'cancel', 'id_license' : active_id}" + attrs="{'invisible' : [('status', '!=', 'pending')]}"/> + <button name="popup_note" string="inactive" type="object" class="oe_button oe_highlight" + context="{'button_info': 'inactive', 'id_license' : active_id}" + attrs="{'invisible' : [('status', '!=', 'active')]}"/> + <field name="status" widget='statusbar'/> + </header> + <sheet> + <group> + <group> + <field name="name"/> + <field name="key"/> + </group> + <group> + <field name="start_date"/> + <field name="end_date"/> + </group> + </group> + <div class="oe_chatter"> + <field name="message_follower_ids" groups="base.group_user" + options="{'post_refresh': 'recipients'}"/> + <field name="activity_ids"/> + <field name="message_ids"/> + </div> + </sheet> + </form> + </field> + </record> + + <record id="view_tree_license" model="ir.ui.view"> + <field name="name">license.manager.tree</field> + <field name="model">license.manager</field> + <field name="arch" type="xml"> + <tree> + <field name="name"/> + <field name="start_date"/> + <field name="end_date"/> + <field name="key"/> + <field name="note"/> + <field name="status"/> + </tree> + </field> + </record> + + <record id="view_license_manager_search" model="ir.ui.view"> + <field name="name">license.manager.search</field> + <field name="model">license.manager</field> + <field name="arch" type="xml"> + <search> + <filter string="Active" name="filter_name" domain="[('status', '=', 'active')]"/> + <filter string="Inactive" name="filter_inactive" domain="[('status', '=', 'inactive')]"/> + <filter string="Pending" name="filter_pending" domain="[('status', '=', 'pending')]"/> + <filter string="Cancel" name="filter_cancel" domain="[('status', '=', 'cancel')]"/> + </search> + <search> + <field name="name" string="Name"/> + <field name="key" string="Key"/> + <field name="start_date" string="Start date"/> + </search> + </field> + </record> + + <record id="view_my_model_kanban" model="ir.ui.view"> + <field name="name">my.model.kanban</field> + <field name="model">license.manager</field> + <field name="arch" type="xml"> + <kanban> + <templates> + <t t-name="kanban-box"> + <div class="oe_kanban_card"> + <strong>Name: + <field name="name"/> + </strong> + <div>Start date: + <field name="start_date"/> + </div> + <div>End date: + <field name="end_date"/> + </div> + <div>Key: + <field name="key"/> + </div> + <div>Note: + <field name="note"/> + </div> + <div>Status: + <field name="status"/> + </div> + </div> + </t> + </templates> + </kanban> + </field> + </record> + + <record id="action_license" model="ir.actions.act_window"> + <field name="name">license.manager</field> + <field name="res_model">license.manager</field> + <field name="view_mode">tree,form,kanban</field> + </record> + </odoo> diff --git a/s_license/s_license_module/views/s_license_view/susscess.xml b/s_license/s_license_module/views/s_license_view/susscess.xml new file mode 100644 index 0000000000000000000000000000000000000000..ca2cf69b0312f0566715fbddb502721c5cdeb643 --- /dev/null +++ b/s_license/s_license_module/views/s_license_view/susscess.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> +<odoo> + <template id="license_success_id"> + <div class="container"> + <h1>License Registration Successful</h1> + <p>Your license has been registered successfully.</p> + </div> + </template> +</odoo> diff --git a/s_license/s_license_module/wizard/__init__.py b/s_license/s_license_module/wizard/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..7f7cd57e268a5990f487a6a1069a3f8042dddd21 --- /dev/null +++ b/s_license/s_license_module/wizard/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +from . import s_license_popup diff --git a/s_license/s_license_module/wizard/s_license_popup.py b/s_license/s_license_module/wizard/s_license_popup.py new file mode 100644 index 0000000000000000000000000000000000000000..fff7153b8155c76c60489aa53cf0ebe44495b61e --- /dev/null +++ b/s_license/s_license_module/wizard/s_license_popup.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +from odoo import models, fields, api + + +class LicensePopup(models.TransientModel): + _name = 'license.popup' + _description = 'License Popup' + + note = fields.Char('Note') + + def confirm_action(self): + value_button = self.env.context.get("button_info") + id_license = self.env.context.get("id_license") + license_update = self.env["license.manager"].browse(id_license) + license_update.status = value_button + note = self.create_date.strftime('%d/%m/%y') + " - " + self.note + if not license_update.note: + license_update.note = f"""{note}""" + else: + license_update.note = f"""{license_update.note} +{note}""" + self.env["license.manager"].write(license_update) + return True diff --git a/s_license/s_license_module/wizard/s_license_wizard_view.xml b/s_license/s_license_module/wizard/s_license_wizard_view.xml new file mode 100644 index 0000000000000000000000000000000000000000..1241ce206b8fa8a3c9bd4fa3e97c41ab3b1b6fc2 --- /dev/null +++ b/s_license/s_license_module/wizard/s_license_wizard_view.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="UTF-8"?> +<odoo> + <record id="form_pop_input_note_id" model="ir.ui.view"> + <field name="name">license.manager.form_popup</field> + <field name="model">license.popup</field> + <field name="arch" type="xml"> + <form string=""> + <sheet> + <group> + <field name="note" string="Note" placeholder="Enter note"/> + </group> + <footer> + <button string="Confim" type="object" name="confirm_action" class="btn-primary"/> + <button string="Cancel" class="btn-secondary" special="cancel"/> + </footer> + </sheet> + </form> + </field> + </record> +</odoo>