Skip to content
Snippets Groups Projects
Commit 977f0f15 authored by Daniil Digtyar Vasilieva's avatar Daniil Digtyar Vasilieva :call_me:
Browse files

[REL] Release sprint 25/09/23

Merge branch 'release/25_09_23' into '14.0'

See merge request !213
parents 0b3e1849 5e3a73b5
Branches dev
No related tags found
2 merge requests!239Draft: [REL] energy_communities: dependency energy_selfconsumption bump to,!213[REL] Release sprint 25/09/23
Pipeline #54272 passed
Showing
with 1485 additions and 30 deletions
{
"name": "Energy Community",
"version": "14.0.2.0.0",
"version": "14.0.2.0.1",
"depends": [
"account",
"cooperator_account_banking_mandate",
......
......@@ -71,30 +71,72 @@ class LandingPage(models.Model):
string="Community status",
)
def to_dict(self):
def _get_image_attachment(self, field_name):
file_attachment = self.env["ir.attachment"].search(
[
("res_id", "=", self.id),
("res_model", "=", "landing.page"),
("res_field", "=", field_name),
]
)
return file_attachment
def _get_image_write_date(self, field_name):
file_write_date = ""
file_attachment = self._get_image_attachment(field_name)
if file_attachment:
file_write_date = str(file_attachment.write_date)
return file_write_date
def _get_image_extension(self, field_name):
file_write_date = ""
file_attachment = self._get_image_attachment(field_name)
extension = ""
if file_attachment:
extension = file_attachment.mimetype.split("/")[1]
return extension
def _get_image_payload(self, field_name):
base_url = self.env["ir.config_parameter"].get_param("web.base.url")
return (
base_url
+ "/web/image/landing.page/"
+ str(self.id)
+ "/"
+ field_name
+ "/"
+ str(self.id)
+ "-"
+ field_name
+ "."
+ self._get_image_extension(field_name)
)
def to_dict(self):
if self.primary_image_file:
primary_image_file = (
base_url
+ "/web/image/landing.page/"
+ str(self.id)
+ "/primary_image_file"
primary_image_file = self._get_image_payload("primary_image_file")
primary_image_file_write_date = self._get_image_write_date(
"primary_image_file"
)
else:
primary_image_file = ""
primary_image_file_write_date = ""
if self.secondary_image_file:
secondary_image_file = (
base_url
+ "/web/image/landing.page/"
+ str(self.id)
+ "/secondary_image_file"
secondary_image_file = self._get_image_payload("secondary_image_file")
secondary_image_file_write_date = self._get_image_write_date(
"secondary_image_file"
)
else:
secondary_image_file = ""
secondary_image_file_write_date = ""
if self.map_place_id:
map_reference = self.map_place_id.slug_id
else:
map_reference = ""
if self.why_become_cooperator == "<p><br></p>":
self.why_become_cooperator = ""
if self.become_cooperator_process == "<p><br></p>":
self.become_cooperator_process = ""
return {
"landing": {
"id": self.id,
......@@ -117,11 +159,13 @@ class LandingPage(models.Model):
# TODO: group_image_link Left for backward compatibility. To be removed
"group_image_link": self.group_image_link or "",
"primary_image_file": primary_image_file,
"primary_image_file_write_date": primary_image_file_write_date,
"secondary_image_file": secondary_image_file,
"secondary_image_file_write_date": secondary_image_file_write_date,
"short_description": self.short_description or "",
"long_description": self.long_description or "",
"why_become_cooperator": self.why_become_cooperator or "",
"become_cooperator_process": self.become_cooperator_process or "",
"why_become_cooperator": self.why_become_cooperator,
"become_cooperator_process": self.become_cooperator_process,
"map_geolocation": self.map_geolocation or "",
"map_reference": map_reference,
"street": self.street or "",
......@@ -133,6 +177,10 @@ class LandingPage(models.Model):
def action_landing_page_status(self):
for record in self:
new_status = "draft" if record.status == "publish" else "publish"
record.write({"status": new_status})
def _update_wordpress(self):
for record in self:
instance_company = self.env["res.company"].search(
[("hierarchy_level", "=", "instance")]
)
......@@ -143,9 +191,11 @@ class LandingPage(models.Model):
auth = Authenticate(baseurl, username, password).authenticate()
token = "Bearer %s" % auth["token"]
landing_page_data = record.to_dict()
landing_page_data["landing"]["status"] = new_status
LandingPageResource(token, baseurl, record.wp_landing_page_id).update(
landing_page_data
)
record.write({"status": new_status})
def write(self, vals):
res = super().write(vals)
self._update_wordpress()
return res
......@@ -84,7 +84,8 @@ class Client:
if headers.get("Content-Type") == "application/json":
payload = json.dumps(payload)
logger.info("{verb} {url} \n {body}".format(verb=verb, url=url, body=payload))
logger.info("{verb} {url} \n {body}".format(
verb=verb, url=url, body=payload))
try:
response = requests.request(
......
......@@ -218,7 +218,9 @@ S_LANDING_PAGE_CREATE = {
},
"group_image_link": {"type": "string"},
"primary_image_file": {"type": "string"},
"primary_image_file_write_date": {"type": "string"},
"secondary_image_file": {"type": "string"},
"secondary_image_file_write_date": {"type": "string"},
"short_description": {"type": "string"},
"long_description": {"type": "string"},
"why_become_cooperator": {"type": "string"},
......
......@@ -49,6 +49,7 @@
<group col="4">
<field name="primary_image_file" widget="image" />
<field name="secondary_image_file" widget="image" />
</group>
<group>
<field name="short_description" />
......
from . import models
from . import tests
......@@ -9,15 +9,21 @@
"author": "Coopdevs Treball SCCL & Som Energia SCCL",
"website": "https://coopdevs.org",
"category": "Customizations",
"version": "14.0.1.2.0",
"version": "14.0.2.0.0",
"depends": [
"base",
"mail",
"cooperator",
],
"data": [
"data/energy_project.reseller.csv",
"data/energy_project.supplier.csv",
"security/res_groups.xml",
"security/ir.model.access.csv",
"security/ir_rule_data.xml",
"views/inscription_views.xml",
"views/reseller_views.xml",
"views/supplier_views.xml",
"views/res_config_settings_views.xml",
],
}
This diff is collapsed.
This diff is collapsed.
from . import project
from . import project_type
from . import inscription
from . import reseller
from . import supplier
......@@ -31,30 +31,55 @@ class Inscription(models.Model):
string="Partner",
)
effective_date = fields.Date(required=True)
is_member = fields.Char(
string=_("Typology"), compute="_compute_is_member", readonly=True
)
@api.depends("partner_id.member")
def _compute_is_member(self):
for record in self:
record.is_member = (
_("Partner") if record.partner_id.member else _("Non-partner")
)
def has_matching_supply_assignations(self):
matching_tables = self.project_id.selfconsumption_id.distribution_table_ids.filtered(
lambda table: table.state in ('validated', 'process', 'active')
matching_tables = (
self.project_id.selfconsumption_id.distribution_table_ids.filtered(
lambda table: table.state in ("validated", "process", "active")
)
)
matching_assignations = matching_tables.mapped('supply_point_assignation_ids').filtered(
lambda assignation: assignation.supply_point_id.partner_id == self.partner_id
matching_assignations = matching_tables.mapped(
"supply_point_assignation_ids"
).filtered(
lambda assignation: assignation.supply_point_id.partner_id
== self.partner_id
)
return matching_assignations
def get_matching_supply_assignations_to_remove(self):
supply_point_assignations = self.env['energy_selfconsumption.supply_point_assignation'].search([
('supply_point_id.partner_id', '=', self.partner_id.id),
('selfconsumption_project_id', '=', self.project_id.id),
('distribution_table_id.state', '=', 'draft')
])
supply_point_assignations = self.env[
"energy_selfconsumption.supply_point_assignation"
].search(
[
("supply_point_id.partner_id", "=", self.partner_id.id),
("selfconsumption_project_id", "=", self.project_id.id),
("distribution_table_id.state", "=", "draft"),
]
)
return supply_point_assignations
def unlink(self):
matching_assignations = self.has_matching_supply_assignations()
if len(matching_assignations) > 0:
table_states = ', '.join(matching_assignations.distribution_table_id.mapped('state'))
raise ValidationError(_("The inscription cannot be deleted. It is related to a distribution table with state: {table_state}").format(table_state=table_states))
table_states = ", ".join(
matching_assignations.distribution_table_id.mapped("state")
)
raise ValidationError(
_(
"The inscription cannot be deleted. It is related to a distribution table with state: {table_state}"
).format(table_state=table_states)
)
supply_point_assignations = self.get_matching_supply_assignations_to_remove()
if supply_point_assignations:
supply_point_assignations.unlink()
return super(Inscription, self).unlink()
return super().unlink()
from odoo import api, fields, models
class Reseller(models.Model):
_name = "energy_project.reseller"
_description = "Energy Reseller"
"""
The string values are in spanish so it can be identified by Odoo when importing directly the CSV downloaded from the CNMC.
This values can be still be translated without problem.
"""
order = fields.Char(string="Nº de orden")
name = fields.Char(string="Nombre empresa")
address = fields.Char(string="Dirección empresa")
zip = fields.Char(string="C.P.")
city = fields.Char(string="Municipio empresa")
province = fields.Char(string="Provincia empresa")
phone = fields.Char(string="Teléfono Att cliente gratuito")
scope = fields.Char(string="Ámbito actuación")
vat = fields.Char(string="NIF empresa")
inscription_date = fields.Date(string="Fecha alta")
uninscription_date = fields.Date(string="Fecha baja")
web = fields.Char(string="Página web")
state = fields.Char(string="Estado")
def _load_records(self, data_list, update=False):
new_data_list = []
for data in data_list:
values = data["values"]
if values.get("order"):
xml_id = "energy_project.reseller_%s" % (values.get("order"))
new_data_list.append(dict(xml_id=xml_id, values=values, noupdate=True))
else:
new_data_list.append(data)
return super()._load_records(new_data_list, update)
from odoo import api, fields, models
class Supplier(models.Model):
_name = "energy_project.supplier"
_description = "Energy Supplier"
"""
The string values are in spanish so it can be identified by Odoo when importing directly the CSV downloaded from the CNMC.
This values can still be translated without problem.
"""
nif = fields.Char(string="NIF empresa")
order = fields.Char(string="Nº de orden")
name = fields.Char(string="Nombre empresa")
phone = fields.Char(string="Teléfono gratuito incidencias")
portal = fields.Char(string="Portal de medidas")
def _load_records(self, data_list, update=False):
new_data_list = []
for data in data_list:
values = data["values"]
if values.get("order"):
xml_id = "energy_project.supplier_%s" % (values.get("order"))
new_data_list.append(dict(xml_id=xml_id, values=values, noupdate=True))
else:
new_data_list.append(data)
return super()._load_records(new_data_list, update)
......@@ -5,3 +5,5 @@ access_energy_project_inscription_user,energy_project.inscription.user,model_ene
access_energy_project_project_admin,energy_project.project.admin,model_energy_project_project,group_admin,1,1,1,1
access_energy_project_project_type_admin,energy_project.project_type.admin,model_energy_project_project_type,group_admin,1,1,1,1
access_energy_project_inscription_admin,energy_project.inscription.admin,model_energy_project_inscription,group_admin,1,1,1,1
access_energy_project_reseller_admin,energy_project.reseller.admin,model_energy_project_reseller,group_admin,1,1,1,1
access_energy_project_supplier_admin,energy_project.supplier.admin,model_energy_project_supplier,group_admin,1,1,1,1
from . import test_reseller
from . import test_supplier
from odoo.exceptions import ValidationError
from odoo.tests import common
class TestReseller(common.SingleTransactionCase):
def test_reseller_load_xml_id(self):
fields = [
"order",
"name",
"address",
"zip",
"city",
"province",
"phone",
"scope",
"vat",
"inscription_date",
"uninscription_date",
"web",
"state",
]
data = [
[
"R2-9999",
"ENDESA ENERGÍA S.A.U.",
"C/ RIBERA DEL LOIRA, Nº 60",
"28042",
"MADRID",
"Madrid",
"800 760 909",
"N; INTER AND",
"A81948077",
"2023-01-01",
"2023-02-02",
"www.endesaclientes.com",
"Baja",
]
]
load_result = self.env["energy_project.reseller"].load(fields, data)
reseller_id = self.env["energy_project.reseller"].browse(load_result["ids"])
xml_id = reseller_id.get_external_id()
self.assertEqual(xml_id[reseller_id.id], "energy_project.reseller_R2-9999")
from odoo.tests import common
class TestSupplier(common.SingleTransactionCase):
def test_supplier_load_xml_id(self):
fields = ["nif", "order", "name", "phone", "portal"]
data = [
[
"B22215487",
"R1-285",
"ENERGIAS DE BENASQUE S.L",
"900 102 303",
"https://portal.asemeservicios.com",
]
]
load_result = self.env["energy_project.supplier"].load(fields, data)
supplier_id = self.env["energy_project.supplier"].browse(load_result["ids"])
xml_id = supplier_id.get_external_id()
self.assertEqual(xml_id[supplier_id.id], "energy_project.supplier_R1-285")
......@@ -11,6 +11,7 @@
options="{'no_create': True}"
width="50%"
/>
<field name="is_member" readonly="1" />
<field name="effective_date" width="50%" />
</tree>
</field>
......
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<data>
<record id="view_res_config_settings_view_form" model="ir.ui.view">
<field name="name">res.config.settings.view.form.inherit.reseller</field>
<field name="model">res.config.settings</field>
<field name="inherit_id" ref="base.res_config_settings_view_form" />
<field name="arch" type="xml">
<xpath expr="//div[hasclass('settings')]" position="inside">
<div
class="app_settings_block"
data-string="Energy Project"
string="Energy Project"
data-key="energy_project"
>
<h2>Resellers</h2>
<div
class="row mt16 o_settings_container"
name="reseller_setting_container"
>
<div
class="col-12 col-lg-6 o_setting_box"
id="active_reseller_setting"
>
<div class="o_setting_right_pane">
<span class="o_form_label">
Resellers
</span>
<br />
<button
name="energy_project.reseller_act_window"
icon="fa-arrow-right"
type="action"
string="Manage Resellers"
class="btn-link o_web_settings_access_rights"
/>
</div>
</div>
</div>
<h2>Supplier</h2>
<div
class="row mt16 o_settings_container"
name="supplier_setting_container"
>
<div
class="col-12 col-lg-6 o_setting_box"
id="active_supplier_setting"
>
<div class="o_setting_right_pane">
<span class="o_form_label">
Supplier
</span>
<br />
<button
string="Manage Supplier"
type="action"
icon="fa-arrow-right"
class="btn-link o_web_settings_access_rights"
name="energy_project.supplier_act_window"
/>
</div>
</div>
</div>
</div>
</xpath>
</field>
</record>
</data>
</odoo>
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<data>
<record id="reseller_form_view" model="ir.ui.view">
<field name="name">energy_project.reseller.form</field>
<field name="model">energy_project.reseller</field>
<field name="arch" type="xml">
<form string="Reseller">
<sheet>
<div class="oe_title">
<label for="name" />
<h1>
<field name="name" placeholder="Name" />
</h1>
</div>
<group>
<group>
<field name="order" readonly="True" />
<field name="address" />
<field name="zip" />
<field name="city" />
<field name="province" />
<field name="phone" />
<field name="scope" />
<field name="vat" />
<field name="inscription_date" />
<field name="uninscription_date" />
<field name="web" />
<field name="state" />
</group>
</group>
</sheet>
</form>
</field>
</record>
<record id="reseller_tree_view" model="ir.ui.view">
<field name="name">energy_project.reseller.tree</field>
<field name="model">energy_project.reseller</field>
<field name="arch" type="xml">
<tree string="Reseller" import="1" create="1">
<field name="order" />
<field name="name" />
<field name="address" />
<field name="zip" />
<field name="city" />
<field name="province" />
<field name="phone" />
<field name="scope" />
<field name="vat" />
<field name="inscription_date" />
<field name="uninscription_date" />
<field name="web" />
<field name="state" />
</tree>
</field>
</record>
<record id="reseller_act_window" model="ir.actions.act_window">
<field name="name">Reseller</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">energy_project.reseller</field>
<field name="view_mode">tree,form</field>
<field name="help" type="html">
<p class="oe_view_nocontent_create">
There are no energy reseller yet, click here to add a new one.
</p>
</field>
</record>
</data>
</odoo>
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment