Skip to content
Extraits de code Groupes Projets
Valider f76f92ed rédigé par Benjamin - Le Filament's avatar Benjamin - Le Filament
Parcourir les fichiers

Merge branch '12-RV-Evol20220517' into '12.0'

Ajout des services User et Calendrier, correction des services contacts / projets / coop

See merge request !1
parents 6d6a68e4 7ff9761c
Branches
Aucune étiquette associée trouvée
1 requête de fusion!1Ajout des services User et Calendrier, correction des services contacts / projets / coop
...@@ -3,4 +3,6 @@ ...@@ -3,4 +3,6 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from . import base_search_param from . import base_search_param
from . import calendar_search_param
from . import calendar_write_param
from . import cgscop_mobile_utils from . import cgscop_mobile_utils
...@@ -14,3 +14,4 @@ class CgScopMobileBaseSearchParam(Datamodel): ...@@ -14,3 +14,4 @@ class CgScopMobileBaseSearchParam(Datamodel):
filter = fields.String(required=False, allow_none=False) filter = fields.String(required=False, allow_none=False)
offset = fields.Integer(required=False, allow_none=False) offset = fields.Integer(required=False, allow_none=False)
limit = fields.Integer(required=False, allow_none=False) limit = fields.Integer(required=False, allow_none=False)
ur_id = fields.Integer(required=False, allow_none=False)
# © 2022 Le Filament (<https://www.le-filament.com>)
# © 2022 Confédération Générale des Scop (<https://www.les-scop.coop>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from marshmallow import fields
from odoo.addons.datamodel.core import Datamodel
class CgScopMobileCalendarSearchParam(Datamodel):
_name = "cgscopmobile.calendar.search.param"
id = fields.Integer(required=False, allow_none=False)
user_id = fields.Integer(required=False, allow_none=False)
minDate = fields.DateTime(required=False, allow_none=False)
maxDate = fields.DateTime(required=False, allow_none=False)
# © 2022 Le Filament (<https://www.le-filament.com>)
# © 2022 Confédération Générale des Scop (<https://www.les-scop.coop>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from marshmallow import fields
from odoo.addons.datamodel.core import Datamodel
class CgScopMobileCalendarWriteParam(Datamodel):
_name = "cgscopmobile.calendar.write.param"
id = fields.Integer(required=False, allow_none=False)
name = fields.String(required=True, allow_none=False)
description = fields.String(required=True, allow_none=False)
allday = fields.Boolean(required=True, allow_none=False)
duration = fields.Float(required=True, allow_none=False)
start = fields.DateTime(required=True, allow_none=False)
stop = fields.DateTime(required=False, allow_none=False)
...@@ -3,6 +3,8 @@ ...@@ -3,6 +3,8 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from . import exception_services from . import exception_services
from . import user_services
from . import cooperative_services from . import cooperative_services
from . import contact_services from . import contact_services
from . import project_services from . import project_services
from . import calendar_services
# © 2022 Le Filament (<https://www.le-filament.com>)
# © 2022 Confédération Générale des Scop (<https://www.les-scop.coop>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from odoo.addons.cgscop_mobile_api.models.calendar_search_param import (
CgScopMobileCalendarSearchParam,
)
import odoo.addons.cgscop_mobile_api.models.calendar_write_param
from odoo.addons.base_rest import restapi
from odoo.addons.base_rest_datamodel.restapi import Datamodel
from odoo.addons.component.core import Component
class CgScopMobileCalendarServices(Component):
_inherit = ["base.rest.service", "cgscop_mobile.utils"]
_name = "cgscopmobile.calendar.services"
_usage = "calendrier"
_collection = "cgscopmobile.services.coll"
_description = """
Calendar Mobile API Services
Services developed with the new api provided by base_rest
"""
@restapi.method(
[(["/<int:id>/get", "/<int:id>"], "GET")],
auth="user",
)
def get(self, _id):
"""
Get event's information
"""
my_search_param = CgScopMobileCalendarSearchParam()
my_search_param.id = _id
return self._search(my_search_param, True)
@restapi.method(
[(["/", "/search"], "POST")],
input_param=Datamodel("cgscopmobile.calendar.search.param"),
auth="user",
)
def search(self, my_search_param):
"""
Search for events
:param base_search_param: An instance of partner.search.param
"""
return self._search(my_search_param, False)
@restapi.method(
[(["/write"], "POST")],
input_param=Datamodel("cgscopmobile.calendar.write.param"),
auth="user",
)
def write(self, my_write_param):
"""
Create a new event
"""
if my_write_param.id <= 0:
return self._create(my_write_param)
else:
return self._update (my_write_param)
@restapi.method(
[(["/delete/<int:id>"], "GET")],
auth="user",
)
def delete(self, _id):
"""
Get event's information
"""
self._delete(_id)
res = {"count": 0, "rows": []}
return res
# The following method are 'private' and should be never never NEVER call
# from the controller.
def _create(self, my_write_param):
event = self.env["calendar.event"].create({
'name': my_write_param.name,
'description': my_write_param.name,
'allday': my_write_param.allday,
'duration': my_write_param.duration,
'start': my_write_param.start,
'stop': my_write_param.stop
})
return self._to_json(True, event)
def _update(self, my_write_param):
event = self.env["calendar.event"].browse(my_write_param.id)
if event:
event.write({
'name': my_write_param.name,
'description': my_write_param.name,
'allday': my_write_param.allday,
'duration': my_write_param.duration,
'start': my_write_param.start,
'stop': my_write_param.stop
})
return self._to_json(True, event)
return {}
def _delete(self, id):
event = self.env["calendar.event"].browse(id)
if event:
event.unlink()
return
def _search(self, my_search_param, detailed):
"""
Search for events
:param calendar_search_param: An instance of calendar.search.param
:param detailed: specify detailed output
"""
domain = []
if my_search_param.id:
domain.append(("id", "=", my_search_param.id))
else:
domain.append(("active", "=", True))
domain.append(("user_id", "=", my_search_param.user_id))
domain.append(("start", ">=", my_search_param.minDate))
domain.append(("start", "<=", my_search_param.maxDate))
nbrec = self.env["calendar.event"].search_count(domain)
events = self.env["calendar.event"].search(domain)
rows = []
res = {"count": nbrec, "rows": rows}
for event in events:
rows.append(self._to_json(detailed, event))
return res
def _to_json(self, detailed, event):
"""
Generate output json
:param event: An instance of calendar.event
:param detailed: specify detailed output
"""
res = {
"id": self.getinteger(event.id),
"name": self.getstring(event.name),
"description": self.getstring(event.description),
"start": self.getstring(event.start),
"allday": self.getboolean(event.allday),
}
if detailed:
res.update(
{
"stop": self.getstring(event.stop),
"start_date": self.getstring(event.start_date),
"stop_date": self.getstring(event.stop_date),
"start_datetime": self.getstring(event.start_datetime),
"stop_datetime": self.getstring(event.stop_datetime),
"duration": self.getinteger(event.duration),
}
)
return res
...@@ -31,6 +31,7 @@ class CgScopMobileContactServices(Component): ...@@ -31,6 +31,7 @@ class CgScopMobileContactServices(Component):
""" """
my_search_param = CgScopMobileBaseSearchParam() my_search_param = CgScopMobileBaseSearchParam()
my_search_param.id = _id my_search_param.id = _id
my_search_param.ur_id = 0;
return self._search(my_search_param, True) return self._search(my_search_param, True)
...@@ -71,6 +72,10 @@ class CgScopMobileContactServices(Component): ...@@ -71,6 +72,10 @@ class CgScopMobileContactServices(Component):
domain.append(("type", "=", "contact")) domain.append(("type", "=", "contact"))
domain.append(("active", "=", True)) domain.append(("active", "=", True))
# On regarde si il faut limiter à l'UR
if my_search_param.ur_id != 0:
domain.append(("ur_id", "=", my_search_param.ur_id))
offset = 0 offset = 0
if my_search_param.offset: if my_search_param.offset:
offset = my_search_param.offset offset = my_search_param.offset
...@@ -79,10 +84,11 @@ class CgScopMobileContactServices(Component): ...@@ -79,10 +84,11 @@ class CgScopMobileContactServices(Component):
if my_search_param.limit: if my_search_param.limit:
limit = my_search_param.limit limit = my_search_param.limit
nbrec = self.env["res.partner"].search_count(domain)
partners = self.env["res.partner"].search(domain, limit=limit, offset=offset) partners = self.env["res.partner"].search(domain, limit=limit, offset=offset)
rows = [] rows = []
res = {"count": len(partners), "rows": rows} res = {"count": nbrec, "rows": rows}
for partner in partners: for partner in partners:
rows.append(self._to_json(detailed, partner)) rows.append(self._to_json(detailed, partner))
return res return res
...@@ -98,6 +104,8 @@ class CgScopMobileContactServices(Component): ...@@ -98,6 +104,8 @@ class CgScopMobileContactServices(Component):
"id": self.getinteger(partner.id), "id": self.getinteger(partner.id),
"name": self.getstring(partner.name), "name": self.getstring(partner.name),
"email": self.getstring(partner.email), "email": self.getstring(partner.email),
"phone": self.getstring(partner.phone),
"image": partner.image.decode("utf-8") if partner.image else None,
} }
if detailed: if detailed:
...@@ -107,7 +115,6 @@ class CgScopMobileContactServices(Component): ...@@ -107,7 +115,6 @@ class CgScopMobileContactServices(Component):
"lastname": self.getstring(partner.lastname), "lastname": self.getstring(partner.lastname),
"firstname": self.getstring(partner.firstname), "firstname": self.getstring(partner.firstname),
"mobile": self.getstring(partner.mobile), "mobile": self.getstring(partner.mobile),
"phone": self.getstring(partner.phone),
"extranet_access": self.getboolean(partner.extranet_access), "extranet_access": self.getboolean(partner.extranet_access),
"extranet_update_company": self.getboolean( "extranet_update_company": self.getboolean(
partner.extranet_update_company partner.extranet_update_company
......
...@@ -31,6 +31,7 @@ class CgScopMobileCooperativeServices(Component): ...@@ -31,6 +31,7 @@ class CgScopMobileCooperativeServices(Component):
""" """
my_search_param = CgScopMobileBaseSearchParam() my_search_param = CgScopMobileBaseSearchParam()
my_search_param.id = _id my_search_param.id = _id
my_search_param.ur_id = 0;
return self._search(my_search_param, True) return self._search(my_search_param, True)
...@@ -73,6 +74,10 @@ class CgScopMobileCooperativeServices(Component): ...@@ -73,6 +74,10 @@ class CgScopMobileCooperativeServices(Component):
domain.append(("membership_status", "=", "member")) domain.append(("membership_status", "=", "member"))
domain.append(("active", "=", True)) domain.append(("active", "=", True))
# On regarde si il faut limiter à l'UR
if my_search_param.ur_id != 0:
domain.append(("ur_id", "=", my_search_param.ur_id))
offset = 0 offset = 0
if my_search_param.offset: if my_search_param.offset:
offset = my_search_param.offset offset = my_search_param.offset
...@@ -81,10 +86,11 @@ class CgScopMobileCooperativeServices(Component): ...@@ -81,10 +86,11 @@ class CgScopMobileCooperativeServices(Component):
if my_search_param.limit: if my_search_param.limit:
limit = my_search_param.limit limit = my_search_param.limit
nbrec = self.env["res.partner"].search_count(domain)
partners = self.env["res.partner"].search(domain, limit=limit, offset=offset) partners = self.env["res.partner"].search(domain, limit=limit, offset=offset)
rows = [] rows = []
res = {"count": len(partners), "rows": rows} res = {"count": nbrec, "rows": rows}
for partner in partners: for partner in partners:
rows.append(self._to_json(detailed, partner)) rows.append(self._to_json(detailed, partner))
return res return res
...@@ -101,6 +107,8 @@ class CgScopMobileCooperativeServices(Component): ...@@ -101,6 +107,8 @@ class CgScopMobileCooperativeServices(Component):
"name": self.getstring(partner.name), "name": self.getstring(partner.name),
"sigle": self.getstring(partner.sigle), "sigle": self.getstring(partner.sigle),
"member_number": self.getstring(partner.member_number), "member_number": self.getstring(partner.member_number),
"image": partner.image.decode("utf-8") if partner.image else None,
} }
if detailed: if detailed:
...@@ -108,6 +116,7 @@ class CgScopMobileCooperativeServices(Component): ...@@ -108,6 +116,7 @@ class CgScopMobileCooperativeServices(Component):
{ {
"street": self.getstring(partner.street), "street": self.getstring(partner.street),
"street2": self.getstring(partner.street2), "street2": self.getstring(partner.street2),
"street3": self.getstring(partner.street3),
"zip": self.getstring(partner.zip), "zip": self.getstring(partner.zip),
"city": self.getstring(partner.city), "city": self.getstring(partner.city),
"zip_departement": self.getstring(partner.zip_departement), "zip_departement": self.getstring(partner.zip_departement),
......
...@@ -31,6 +31,7 @@ class CgScopMobileProjectServices(Component): ...@@ -31,6 +31,7 @@ class CgScopMobileProjectServices(Component):
""" """
my_search_param = CgScopMobileBaseSearchParam() my_search_param = CgScopMobileBaseSearchParam()
my_search_param.id = _id my_search_param.id = _id
my_search_param.ur_id = 0;
return self._search(my_search_param, True) return self._search(my_search_param, True)
...@@ -85,6 +86,10 @@ class CgScopMobileProjectServices(Component): ...@@ -85,6 +86,10 @@ class CgScopMobileProjectServices(Component):
) )
) )
# On regarde si il faut limiter à l'UR
if my_search_param.ur_id != 0:
domain.append(("ur_id", "=", my_search_param.ur_id))
offset = 0 offset = 0
if my_search_param.offset: if my_search_param.offset:
offset = my_search_param.offset offset = my_search_param.offset
...@@ -93,10 +98,11 @@ class CgScopMobileProjectServices(Component): ...@@ -93,10 +98,11 @@ class CgScopMobileProjectServices(Component):
if my_search_param.limit: if my_search_param.limit:
limit = my_search_param.limit limit = my_search_param.limit
nbrec = self.env["res.partner"].search_count(domain)
partners = self.env["res.partner"].search(domain, limit=limit, offset=offset) partners = self.env["res.partner"].search(domain, limit=limit, offset=offset)
rows = [] rows = []
res = {"count": len(partners), "rows": rows} res = {"count": nbrec, "rows": rows}
for partner in partners: for partner in partners:
rows.append(self._to_json(detailed, partner)) rows.append(self._to_json(detailed, partner))
return res return res
...@@ -112,6 +118,9 @@ class CgScopMobileProjectServices(Component): ...@@ -112,6 +118,9 @@ class CgScopMobileProjectServices(Component):
"id": self.getinteger(partner.id), "id": self.getinteger(partner.id),
"name": self.getstring(partner.name), "name": self.getstring(partner.name),
"project_status": self.getstring(partner.project_status), "project_status": self.getstring(partner.project_status),
"member_number": self.getstring(partner.member_number),
"image": partner.image.decode("utf-8") if partner.image else None,
} }
if detailed: if detailed:
...@@ -120,6 +129,7 @@ class CgScopMobileProjectServices(Component): ...@@ -120,6 +129,7 @@ class CgScopMobileProjectServices(Component):
"sigle": self.getstring(partner.sigle), "sigle": self.getstring(partner.sigle),
"street": self.getstring(partner.street), "street": self.getstring(partner.street),
"street2": self.getstring(partner.street2), "street2": self.getstring(partner.street2),
"street3": self.getstring(partner.street2),
"zip": self.getstring(partner.zip), "zip": self.getstring(partner.zip),
"city": self.getstring(partner.city), "city": self.getstring(partner.city),
"zip_departement": self.getstring(partner.zip_departement), "zip_departement": self.getstring(partner.zip_departement),
......
# © 2022 Le Filament (<https://www.le-filament.com>)
# © 2022 Confédération Générale des Scop (<https://www.les-scop.coop>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from odoo.addons.cgscop_mobile_api.models.base_search_param import (
CgScopMobileBaseSearchParam,
)
from odoo.addons.base_rest import restapi
from odoo.addons.base_rest_datamodel.restapi import Datamodel
from odoo.addons.component.core import Component
class CgScopMobileUserServices(Component):
_inherit = ["base.rest.service", "cgscop_mobile.utils"]
_name = "cgscopmobile.user.services"
_usage = "user"
_collection = "cgscopmobile.services.coll"
_description = """
Partner Mobile API Services
Services developed with the new api provided by base_rest
"""
@restapi.method(
[(["/<int:id>/get", "/<int:id>"], "GET")],
auth="user",
)
def get(self, _id):
"""
Get user's information
"""
return self._get(_id)
# The following method are 'private' and should be never never NEVER call
# from the controller.
def _get(self, userId):
"""
Search for user
"""
user = self.env["res.users"].browse(userId)
rows = []
if not user:
return {"count": 0, "rows": rows}
else:
rows.append(self._to_json(user))
return {"count": 1, "rows": rows}
def _to_json(self, user):
"""
Generate output json
:param partner: An instance of user
"""
res = {
"id": self.getinteger(user.id),
"login": self.getstring(user.login),
}
res["ur"] = self.getnested(user.ur_id)
res["partner"] = self.getpartner(user.partner_id)
return res
def getpartner(self, partner):
res = {}
if partner:
res.update(
{
"id": self.getinteger(partner.id),
"name": self.getstring(partner.name),
"title": self.getnested(partner.title),
"lastname": self.getstring(partner.lastname),
"firstname": self.getstring(partner.firstname),
"mobile": self.getstring(partner.mobile),
"phone": self.getstring(partner.phone),
"image": partner.image.decode("utf-8") if partner.image else None,
}
)
else:
res.update({"id": 0, "name": ""})
return res
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter