otrs-somconnexio 0.7.3__py2.py3-none-any.whl → 0.8.0__py2.py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- otrs_somconnexio/otrs_models/provision_article.py +2 -5
- otrs_somconnexio/otrs_models/provision_ticket.py +36 -6
- otrs_somconnexio/otrs_models/switchboard_header_data.py +4 -0
- otrs_somconnexio/otrs_models/switchboard_header_ticket.py +58 -0
- {otrs_somconnexio-0.7.3.dist-info → otrs_somconnexio-0.8.0.dist-info}/METADATA +3 -1
- {otrs_somconnexio-0.7.3.dist-info → otrs_somconnexio-0.8.0.dist-info}/RECORD +16 -16
- tests/otrs_models/test_adsl_ticket.py +9 -8
- tests/otrs_models/test_fiber_ticket.py +18 -8
- tests/otrs_models/test_mobile_ticket.py +14 -4
- tests/otrs_models/test_provision_article.py +9 -26
- tests/otrs_models/test_router_4G_ticket.py +18 -10
- tests/otrs_models/test_switchboard_header_data.py +2 -0
- tests/otrs_models/test_switchboard_header_ticket.py +84 -6
- tests/otrs_models/test_switchboard_ticket.py +7 -6
- {otrs_somconnexio-0.7.3.dist-info → otrs_somconnexio-0.8.0.dist-info}/WHEEL +0 -0
- {otrs_somconnexio-0.7.3.dist-info → otrs_somconnexio-0.8.0.dist-info}/top_level.txt +0 -0
|
@@ -1,12 +1,9 @@
|
|
|
1
1
|
# coding: utf-8
|
|
2
2
|
from otrs_somconnexio.otrs_models.abstract_article import AbstractArticle
|
|
3
|
-
from otrs_somconnexio.services.get_ticket_title import GetTicketTitle
|
|
4
3
|
|
|
5
4
|
|
|
6
5
|
class ProvisionArticle(AbstractArticle):
|
|
7
|
-
def __init__(self,
|
|
8
|
-
subject = GetTicketTitle(technology, order_id, service_type).build()
|
|
6
|
+
def __init__(self, subject, notes=""):
|
|
9
7
|
self.subject = subject
|
|
10
|
-
if notes
|
|
11
|
-
self.isVisibleForCustomer = "0"
|
|
8
|
+
self.isVisibleForCustomer = "0" if notes else "1"
|
|
12
9
|
self.body = notes
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# coding: utf-8
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
import base64
|
|
3
|
+
from pyotrs.lib import Attachment, Ticket
|
|
4
4
|
from otrs_somconnexio.client import OTRSClient
|
|
5
5
|
from otrs_somconnexio.otrs_models.provision_article import ProvisionArticle
|
|
6
6
|
from otrs_somconnexio.services.get_ticket_title import GetTicketTitle
|
|
@@ -11,8 +11,12 @@ class ProvisionTicket:
|
|
|
11
11
|
self.responsible_data = responsible_data
|
|
12
12
|
|
|
13
13
|
def create(self):
|
|
14
|
+
new_ticket = self._build_ticket()
|
|
14
15
|
self.otrs_ticket = OTRSClient().create_otrs_process_ticket(
|
|
15
|
-
|
|
16
|
+
new_ticket,
|
|
17
|
+
article=self._build_article(),
|
|
18
|
+
dynamic_fields=self._build_dynamic_fields(),
|
|
19
|
+
attachments=self._build_attachments(),
|
|
16
20
|
)
|
|
17
21
|
|
|
18
22
|
@property
|
|
@@ -40,11 +44,16 @@ class ProvisionTicket:
|
|
|
40
44
|
}
|
|
41
45
|
)
|
|
42
46
|
|
|
47
|
+
def _get_article_subject(self):
|
|
48
|
+
return self._ticket_title()
|
|
49
|
+
|
|
50
|
+
def _get_article_notes(self):
|
|
51
|
+
return self.service_data.notes
|
|
52
|
+
|
|
43
53
|
def _build_article(self):
|
|
44
54
|
provision_article = ProvisionArticle(
|
|
45
|
-
self.
|
|
46
|
-
self.
|
|
47
|
-
self.service_type(),
|
|
55
|
+
self._get_article_subject(),
|
|
56
|
+
self._get_article_notes(),
|
|
48
57
|
)
|
|
49
58
|
return provision_article.call()
|
|
50
59
|
|
|
@@ -55,6 +64,21 @@ class ProvisionTicket:
|
|
|
55
64
|
self.service_type(),
|
|
56
65
|
).build()
|
|
57
66
|
|
|
67
|
+
def _build_attachments(self):
|
|
68
|
+
docs = self._files_to_attach()
|
|
69
|
+
if not docs:
|
|
70
|
+
return []
|
|
71
|
+
return [
|
|
72
|
+
Attachment.create_basic(
|
|
73
|
+
Content=base64.b64encode(bytes(doc["Content"], "utf-8")).decode(
|
|
74
|
+
"utf-8"
|
|
75
|
+
),
|
|
76
|
+
Filename=doc["Filename"],
|
|
77
|
+
ContentType=doc.get("ContentType", "text/plain"),
|
|
78
|
+
)
|
|
79
|
+
for doc in docs
|
|
80
|
+
]
|
|
81
|
+
|
|
58
82
|
def _ticket_type(self):
|
|
59
83
|
return self.otrs_configuration.type
|
|
60
84
|
|
|
@@ -93,3 +117,9 @@ class ProvisionTicket:
|
|
|
93
117
|
return self.responsible_data.email
|
|
94
118
|
else:
|
|
95
119
|
return False
|
|
120
|
+
|
|
121
|
+
def _files_to_attach(self):
|
|
122
|
+
"""Override to attach files to the ticket.
|
|
123
|
+
Format: [{"Filename": "file.txt", "Content": "file content", "ContentType": "text/plain"}, ...]
|
|
124
|
+
"""
|
|
125
|
+
return []
|
|
@@ -8,6 +8,8 @@ class SwitchboardHeaderData:
|
|
|
8
8
|
contact_phone,
|
|
9
9
|
sales_team,
|
|
10
10
|
technology,
|
|
11
|
+
lead_line_data,
|
|
12
|
+
agent_data,
|
|
11
13
|
notes="",
|
|
12
14
|
):
|
|
13
15
|
self.order_id = order_id
|
|
@@ -15,4 +17,6 @@ class SwitchboardHeaderData:
|
|
|
15
17
|
self.contact_phone = contact_phone
|
|
16
18
|
self.sales_team = sales_team
|
|
17
19
|
self.technology = technology
|
|
20
|
+
self.lead_line_data = lead_line_data
|
|
21
|
+
self.agent_data = agent_data
|
|
18
22
|
self.notes = notes
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
# coding: utf-8
|
|
2
|
+
from tabulate import tabulate
|
|
3
|
+
from itertools import groupby
|
|
2
4
|
from otrs_somconnexio.otrs_models.provision_ticket import ProvisionTicket
|
|
3
5
|
from otrs_somconnexio.otrs_models.switchboard_header_dynamic_fields import (
|
|
4
6
|
SwitchboardHeaderDynamicFields,
|
|
@@ -28,3 +30,59 @@ class SwitchboardHeaderTicket(ProvisionTicket):
|
|
|
28
30
|
|
|
29
31
|
def _ticket_title(self):
|
|
30
32
|
return "Provisió centraleta virtual (CV) → Capçalera"
|
|
33
|
+
|
|
34
|
+
def _files_to_attach(self):
|
|
35
|
+
formatted_agent_data = self._format_agent_data()
|
|
36
|
+
|
|
37
|
+
attachments = []
|
|
38
|
+
|
|
39
|
+
if formatted_agent_data:
|
|
40
|
+
attachments.append(
|
|
41
|
+
{
|
|
42
|
+
"Filename": "importació_agents_operator_{}.txt".format(
|
|
43
|
+
self.service_data.order_id
|
|
44
|
+
),
|
|
45
|
+
"Content": formatted_agent_data,
|
|
46
|
+
}
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
return attachments
|
|
50
|
+
|
|
51
|
+
def _get_article_notes(self):
|
|
52
|
+
return self._format_lead_line_data()
|
|
53
|
+
|
|
54
|
+
def _format_lead_line_data(self):
|
|
55
|
+
"""Format lead line data for tsv table attachment."""
|
|
56
|
+
lead_line_data = self.service_data.lead_line_data
|
|
57
|
+
if not lead_line_data:
|
|
58
|
+
return ""
|
|
59
|
+
|
|
60
|
+
lead_table_data = list(zip(*lead_line_data.values()))
|
|
61
|
+
headers = lead_line_data.keys()
|
|
62
|
+
lead_lines_table = tabulate(lead_table_data, headers, tablefmt="csv")
|
|
63
|
+
|
|
64
|
+
return lead_lines_table
|
|
65
|
+
|
|
66
|
+
def _format_agent_data(self):
|
|
67
|
+
"""Format agent data for operator import attachment.
|
|
68
|
+
Sorted by product, grouped by product.
|
|
69
|
+
"""
|
|
70
|
+
agent_data = self.service_data.agent_data
|
|
71
|
+
if not agent_data:
|
|
72
|
+
return ""
|
|
73
|
+
|
|
74
|
+
sorted_agents = sorted(agent_data, key=lambda d: d["product"])
|
|
75
|
+
|
|
76
|
+
pin = "2424"
|
|
77
|
+
agents_info = []
|
|
78
|
+
for product, agents in groupby(sorted_agents, key=lambda ag: ag["product"]):
|
|
79
|
+
agents_info.append(f"{product}:")
|
|
80
|
+
|
|
81
|
+
for agent in agents:
|
|
82
|
+
agents_info.append(
|
|
83
|
+
f"{agent['extension']}\t{agent['agent_name']}\t{pin}\t{agent['agent_name']}\t{agent['agent_email']}" # noqa E501
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
agents_info.append("")
|
|
87
|
+
|
|
88
|
+
return "\n".join(agents_info)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: otrs-somconnexio
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.8.0
|
|
4
4
|
Summary: Python package for Somconnexio data syncing in OTRS
|
|
5
5
|
Home-page: https://gitlab.com/coopdevs/otrs_somconnexio
|
|
6
6
|
Author: Coopdevs
|
|
@@ -14,6 +14,8 @@ Classifier: Programming Language :: Python :: 2.7
|
|
|
14
14
|
Description-Content-Type: text/markdown
|
|
15
15
|
Requires-Dist: pyotrs==0.12.7
|
|
16
16
|
Requires-Dist: future==0.18.2
|
|
17
|
+
Requires-Dist: tabulate==0.9.0
|
|
18
|
+
Requires-Dist: more-itertools==10.0.0
|
|
17
19
|
|
|
18
20
|
# Python 2.7/3.8 module to manage the SomConnexio's ERP integration with OTRS
|
|
19
21
|
|
|
@@ -19,9 +19,9 @@ otrs_somconnexio/otrs_models/mobile_data.py,sha256=Zl5AlbrtfxT4i6z83sAth_dZcOn0y
|
|
|
19
19
|
otrs_somconnexio/otrs_models/mobile_dynamic_fields.py,sha256=cDTG310YUxtOlw8hjKTRrhOiZmC3I1nEvBncaHMhb3Q,3563
|
|
20
20
|
otrs_somconnexio/otrs_models/mobile_ticket.py,sha256=aNtGteRzD-dOtPqqs3KoqggZaeLy_Za1KEBM5aHGCYI,1336
|
|
21
21
|
otrs_somconnexio/otrs_models/providers.py,sha256=Jy5lm_gCuwy_BhpNE5JJ5-TrE8aFQpZvMiYZ-PTlgqs,181
|
|
22
|
-
otrs_somconnexio/otrs_models/provision_article.py,sha256=
|
|
22
|
+
otrs_somconnexio/otrs_models/provision_article.py,sha256=Zs7V9Y8Tag7B8Y_BnEWjIetMO3cSyu397TrItX1jxNI,291
|
|
23
23
|
otrs_somconnexio/otrs_models/provision_dynamic_fields.py,sha256=LdYbmj2RSiGpKzFt4Ws9gUrZdRWec9jVC0lsy2BK7j0,4347
|
|
24
|
-
otrs_somconnexio/otrs_models/provision_ticket.py,sha256=
|
|
24
|
+
otrs_somconnexio/otrs_models/provision_ticket.py,sha256=6Nz11-sG_0YARNqaxbJ0XQsZsXsw7XH3L_ENGIo-hFg,3746
|
|
25
25
|
otrs_somconnexio/otrs_models/responsible_data.py,sha256=KCXkCNe_NLRpVLzeK8iNlbuH-tYag4YOL-MqnCFXn0g,104
|
|
26
26
|
otrs_somconnexio/otrs_models/router_4G_data.py,sha256=EQIVxVstFswmEcOHzzV1ZyDYaadiU7lbunb5CJg6xAM,194
|
|
27
27
|
otrs_somconnexio/otrs_models/router_4G_dynamic_fields.py,sha256=NVrfwD2Mj1TTzOC8NYna1XQYXEN6ffAfovlP9VAIHh4,403
|
|
@@ -29,9 +29,9 @@ otrs_somconnexio/otrs_models/router_4G_ticket.py,sha256=Z02DL-hgnqB_imVIB0nxZCU_
|
|
|
29
29
|
otrs_somconnexio/otrs_models/service.py,sha256=EwxTSe6hPS33KbbPGNYzofhEhB4O4d71P9KkpOEjakA,2121
|
|
30
30
|
otrs_somconnexio/otrs_models/switchboard_data.py,sha256=TQLv8Kfcz9TXJZY2yXUKD2nm1QVaMZyysYMttumH44k,1743
|
|
31
31
|
otrs_somconnexio/otrs_models/switchboard_dynamic_fields.py,sha256=K1cRkn7WCxXCsvWLIblSCr30vTtynyCkDA_PVupnLDo,3149
|
|
32
|
-
otrs_somconnexio/otrs_models/switchboard_header_data.py,sha256=
|
|
32
|
+
otrs_somconnexio/otrs_models/switchboard_header_data.py,sha256=Q3upfUY-alMO26b4D2uKKo531PibcZsVCCCLc35DNjQ,553
|
|
33
33
|
otrs_somconnexio/otrs_models/switchboard_header_dynamic_fields.py,sha256=ODX1fa_KV6Rp_Jvnv_HMvE79VmfxX7Gs-GflMo3__54,2498
|
|
34
|
-
otrs_somconnexio/otrs_models/switchboard_header_ticket.py,sha256=
|
|
34
|
+
otrs_somconnexio/otrs_models/switchboard_header_ticket.py,sha256=b9YwV17Kgc_gaslCIzzpSN7RZTWVr3IMBlH62WZ1WmI,2909
|
|
35
35
|
otrs_somconnexio/otrs_models/switchboard_ticket.py,sha256=h1PtSnLLGlTWbE091qm2vXjia989JkpBnY0yzvn9OxA,1224
|
|
36
36
|
otrs_somconnexio/otrs_models/telecom_company.py,sha256=yh8wIE7-AjWESdFsE479WWZ-3uFz_ljUBKF8GK44oow,3077
|
|
37
37
|
otrs_somconnexio/otrs_models/ticket_factory.py,sha256=QL2u-51EuXy1aJWZxUZMo4JisDoKBAQM83GViXJAPx8,2215
|
|
@@ -123,28 +123,28 @@ tests/otrs_models/common_helper.py,sha256=WAd7aenHTfHvxjZMlwFfr32ajaF285Y75eifMj
|
|
|
123
123
|
tests/otrs_models/test_abstract_article.py,sha256=udzIihoP0h8Ien20JFz1jLm5Sv2b3wO6f2JZK6zRTKQ,861
|
|
124
124
|
tests/otrs_models/test_adsl_data.py,sha256=_NGpe5mStNyKPhZ5xFVS62jMdMr5vkzp9SusHmFh4r4,1484
|
|
125
125
|
tests/otrs_models/test_adsl_dynamic_fields.py,sha256=KfR8RO2EoJC6YRauSBf1ktrS2cgLindyLOu3KTkI_W8,19946
|
|
126
|
-
tests/otrs_models/test_adsl_ticket.py,sha256=
|
|
126
|
+
tests/otrs_models/test_adsl_ticket.py,sha256=iebdC-HDzSZEj-m_hbEsyfjkhhNeHT6FrnET9iDswJc,4587
|
|
127
127
|
tests/otrs_models/test_coverage_article.py,sha256=O_wm0l75m6sBWEcMdLOvBWDNSVXJ89IkL4IijIgiuPk,1519
|
|
128
128
|
tests/otrs_models/test_coverage_ticket.py,sha256=0W4f28BMhtZDvPm71d7YPJuiVi9jUI6WJBbjh3xs0mg,1019
|
|
129
129
|
tests/otrs_models/test_customer_user.py,sha256=9TDojrOsQBqd4kdC8SxvG5Ub18AXkJ_tsYuUeHALZnc,2227
|
|
130
130
|
tests/otrs_models/test_fiber_data.py,sha256=rdFbcqzI49PV2m30vqnBOmZr2rn_MBqC0bJd0K0dcbI,1833
|
|
131
131
|
tests/otrs_models/test_fiber_dynamic_fields.py,sha256=taaR8fU8Gh0RppxfKrltDQDz4YnHaBvOOz5_qXhyWoc,27127
|
|
132
|
-
tests/otrs_models/test_fiber_ticket.py,sha256=
|
|
132
|
+
tests/otrs_models/test_fiber_ticket.py,sha256=DgbNN5oPJgMp-0o-QebzkZUOdWV4TcmFSd4t3umwxfk,6689
|
|
133
133
|
tests/otrs_models/test_mobile_data.py,sha256=EBtwJL9kUaThhnKuqpUk6GFv0KS7RhyCF6dJNgr1-m8,1110
|
|
134
134
|
tests/otrs_models/test_mobile_dynamic_fields.py,sha256=Xi8lj7PCJunwij-VQxqPYnafY2inEqeqQmQfSRFAmOM,19861
|
|
135
135
|
tests/otrs_models/test_mobile_paused_ticket.py,sha256=T7Gyy7hoG994KHXkTWbJVQC_sC1sgZl4C1_sgpx3hwk,1418
|
|
136
|
-
tests/otrs_models/test_mobile_ticket.py,sha256=
|
|
137
|
-
tests/otrs_models/test_provision_article.py,sha256=
|
|
136
|
+
tests/otrs_models/test_mobile_ticket.py,sha256=y6gqz7YY-Uo-p5xx5_TNA_-g-MJENpO2OvLofLTm6PA,5167
|
|
137
|
+
tests/otrs_models/test_provision_article.py,sha256=7M6fgw_CCV4ZydDapbnoCQYE0LrPyHlpqeBysp7aMYk,1188
|
|
138
138
|
tests/otrs_models/test_router_4G_data.py,sha256=3zKZzWd21j8q4oXFG-Pl1Ugtkp4J0_RZx8HtHRzpfKM,1443
|
|
139
139
|
tests/otrs_models/test_router_4G_dynamic_fields.py,sha256=hjUgmZHmAa5MFpaqtcRVbvaIeTZH5Xzmw6U6xbTSZxM,21577
|
|
140
|
-
tests/otrs_models/test_router_4G_ticket.py,sha256=
|
|
140
|
+
tests/otrs_models/test_router_4G_ticket.py,sha256=v5PRz3z9dK12_hmYtM7FAS3X681h7BdLumg4ag9x65I,5140
|
|
141
141
|
tests/otrs_models/test_service.py,sha256=fLFyJ5wE8jszrD9sZlSOebjioR8dv8z2SeGZVcA3r5U,6833
|
|
142
142
|
tests/otrs_models/test_switchboard_data.py,sha256=QlO_vupDFeavLFH1EIXVzRf4qIJ5AtuyvgCg_v4sXTE,1233
|
|
143
143
|
tests/otrs_models/test_switchboard_dynamic_fields.py,sha256=JPPz5j0ArtS_RYaGQqkI7h7SupI6Vj7FfcpxnzLPYN0,6138
|
|
144
|
-
tests/otrs_models/test_switchboard_header_data.py,sha256=
|
|
144
|
+
tests/otrs_models/test_switchboard_header_data.py,sha256=k9ZZ3fnEIIrbca0572PaGLrWm6snjr94grICot3rLcs,592
|
|
145
145
|
tests/otrs_models/test_switchboard_header_dynamic_fields.py,sha256=8jCN7AF3ciUHDU5olA9axJHrSvA8xrWaqtJ8cvPqXsk,3557
|
|
146
|
-
tests/otrs_models/test_switchboard_header_ticket.py,sha256=
|
|
147
|
-
tests/otrs_models/test_switchboard_ticket.py,sha256=
|
|
146
|
+
tests/otrs_models/test_switchboard_header_ticket.py,sha256=kxFXrjhBsYWHxAjlAJXXhIwslZ_JbDsStXN_YCu_NEs,7415
|
|
147
|
+
tests/otrs_models/test_switchboard_ticket.py,sha256=dQYHIyNEM_MPAzNsTljh-4qFaxyvy6HVYoHTMhnqJ64,5471
|
|
148
148
|
tests/otrs_models/test_telecom_company.py,sha256=nC4uBleU2Lr3qHr5VDo-6kbcTVwKgguC85TcbhTOn1c,1450
|
|
149
149
|
tests/otrs_models/test_ticket_factory.py,sha256=nvye2LK3vfYv3xRNqsBO9M0zYWRWAPWjEFgdDpY1whQ,4048
|
|
150
150
|
tests/otrs_models/test_vf_provisioning_article.py,sha256=Yj8vtaowhxP12K_-FMcJNW-5re3yyCCfGLRHCPYgrVA,897
|
|
@@ -196,7 +196,7 @@ tests/services/test_update_ticket_with_provider_info.py,sha256=cZUg-hNV4BoMwafbp
|
|
|
196
196
|
tests/user_management_client/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
197
197
|
tests/user_management_client/test_client.py,sha256=088q9H1yf8Hii7zUF17KULqOO-JCxJLsR7vQ8lGHiqg,4410
|
|
198
198
|
tests/user_management_client/test_user_management_response.py,sha256=HCCG7i2f6-ytrRpTzYZHODKCdW-X5GJn-BMVegd5FXg,1539
|
|
199
|
-
otrs_somconnexio-0.
|
|
200
|
-
otrs_somconnexio-0.
|
|
201
|
-
otrs_somconnexio-0.
|
|
202
|
-
otrs_somconnexio-0.
|
|
199
|
+
otrs_somconnexio-0.8.0.dist-info/METADATA,sha256=8kmIb1rsU7THFSbI9ltja8v7HPAS9J7PLIgfQdCLpw0,3527
|
|
200
|
+
otrs_somconnexio-0.8.0.dist-info/WHEEL,sha256=fS9sRbCBHs7VFcwJLnLXN1MZRR0_TVTxvXKzOnaSFs8,110
|
|
201
|
+
otrs_somconnexio-0.8.0.dist-info/top_level.txt,sha256=gvMaHGNwusWpSIy-PVyb0CKDIA4-4fXmEVER_2a-OnE,23
|
|
202
|
+
otrs_somconnexio-0.8.0.dist-info/RECORD,,
|
|
@@ -12,7 +12,7 @@ class ADSLTicketTestCase(unittest.TestCase):
|
|
|
12
12
|
@patch("otrs_somconnexio.otrs_models.provision_ticket.Ticket")
|
|
13
13
|
def test_build_ticket(self, MockTicket):
|
|
14
14
|
customer_data = Mock(spec=["id"])
|
|
15
|
-
service_data = Mock(spec=["order_id", "technology"])
|
|
15
|
+
service_data = Mock(spec=["order_id", "technology", "notes"])
|
|
16
16
|
expected_ticket_arguments = {
|
|
17
17
|
"Title": "Ticket#{} - Només ADSL".format(service_data.order_id),
|
|
18
18
|
"Type": ADSLTicketConfiguration.type,
|
|
@@ -30,18 +30,19 @@ class ADSLTicketTestCase(unittest.TestCase):
|
|
|
30
30
|
MockTicket.assert_called_with(expected_ticket_arguments)
|
|
31
31
|
|
|
32
32
|
@patch("otrs_somconnexio.otrs_models.provision_ticket.ProvisionArticle")
|
|
33
|
-
def test_build_article(self,
|
|
33
|
+
def test_build_article(self, MockProvisionArticle):
|
|
34
34
|
customer_data = Mock(spec=[])
|
|
35
|
-
service_data = Mock(spec=["order_id", "technology"])
|
|
35
|
+
service_data = Mock(spec=["order_id", "technology", "notes"])
|
|
36
36
|
|
|
37
|
-
|
|
37
|
+
mock_adsl_article = MockProvisionArticle.return_value
|
|
38
38
|
|
|
39
|
-
ADSLTicket(service_data, customer_data, None)
|
|
39
|
+
ticket = ADSLTicket(service_data, customer_data, None)
|
|
40
|
+
ticket._build_article()
|
|
40
41
|
|
|
41
|
-
|
|
42
|
-
|
|
42
|
+
MockProvisionArticle.assert_called_once_with(
|
|
43
|
+
ticket._ticket_title(), service_data.notes
|
|
43
44
|
)
|
|
44
|
-
|
|
45
|
+
mock_adsl_article.call.assert_called_once()
|
|
45
46
|
|
|
46
47
|
@patch("otrs_somconnexio.otrs_models.adsl_ticket.ADSLDynamicFields")
|
|
47
48
|
def test_build_dynamic_fields(self, MockADSLDynamicFields):
|
|
@@ -15,7 +15,7 @@ class FiberTicketTestCase(unittest.TestCase):
|
|
|
15
15
|
@patch("otrs_somconnexio.otrs_models.provision_ticket.Ticket")
|
|
16
16
|
def test_build_ticket(self, MockTicket):
|
|
17
17
|
customer_data = Mock(spec=["id"])
|
|
18
|
-
service_data = Mock(spec=["order_id", "technology"])
|
|
18
|
+
service_data = Mock(spec=["order_id", "technology", "notes"])
|
|
19
19
|
|
|
20
20
|
expected_ticket_arguments = {
|
|
21
21
|
"Title": "Ticket#{} - Només fibra".format(service_data.order_id),
|
|
@@ -36,7 +36,7 @@ class FiberTicketTestCase(unittest.TestCase):
|
|
|
36
36
|
@patch("otrs_somconnexio.otrs_models.provision_ticket.Ticket")
|
|
37
37
|
def test_build_ticket_mixed(self, MockTicket):
|
|
38
38
|
customer_data = Mock(spec=["id"])
|
|
39
|
-
service_data = Mock(spec=["order_id", "technology"])
|
|
39
|
+
service_data = Mock(spec=["order_id", "technology", "notes"])
|
|
40
40
|
service_data.technology = "Mixta"
|
|
41
41
|
expected_ticket_arguments = {
|
|
42
42
|
"Title": "Ticket#{} - Fibra mixta".format(service_data.order_id),
|
|
@@ -55,16 +55,17 @@ class FiberTicketTestCase(unittest.TestCase):
|
|
|
55
55
|
MockTicket.assert_called_with(expected_ticket_arguments)
|
|
56
56
|
|
|
57
57
|
@patch("otrs_somconnexio.otrs_models.provision_ticket.ProvisionArticle")
|
|
58
|
-
def test_build_article(self,
|
|
58
|
+
def test_build_article(self, MockProvisionArticle):
|
|
59
59
|
customer_data = Mock(spec=[])
|
|
60
|
-
service_data = Mock(spec=["order_id", "technology"])
|
|
60
|
+
service_data = Mock(spec=["order_id", "technology", "notes"])
|
|
61
61
|
|
|
62
|
-
mock_mobile_article =
|
|
62
|
+
mock_mobile_article = MockProvisionArticle.return_value
|
|
63
63
|
|
|
64
|
-
FiberTicket(service_data, customer_data, self.responsible_data)
|
|
64
|
+
ticket = FiberTicket(service_data, customer_data, self.responsible_data)
|
|
65
|
+
ticket._build_article()
|
|
65
66
|
|
|
66
|
-
|
|
67
|
-
|
|
67
|
+
MockProvisionArticle.assert_called_once_with(
|
|
68
|
+
ticket._ticket_title(), service_data.notes
|
|
68
69
|
)
|
|
69
70
|
mock_mobile_article.call.assert_called_once()
|
|
70
71
|
|
|
@@ -162,3 +163,12 @@ class FiberTicketTestCase(unittest.TestCase):
|
|
|
162
163
|
self.assertEqual(
|
|
163
164
|
ticket.otrs_configuration.service, "Banda Ancha::Fibra::Provisió Fibra"
|
|
164
165
|
)
|
|
166
|
+
|
|
167
|
+
def test_files_to_attach_no_attachments(self):
|
|
168
|
+
customer_data = Mock()
|
|
169
|
+
service_data = Mock()
|
|
170
|
+
|
|
171
|
+
ticket = FiberTicket(service_data, customer_data, self.responsible_data)
|
|
172
|
+
attachments = ticket._files_to_attach()
|
|
173
|
+
|
|
174
|
+
self.assertFalse(attachments)
|
|
@@ -38,17 +38,18 @@ class MobileTicketTestCase(unittest.TestCase):
|
|
|
38
38
|
|
|
39
39
|
@patch("otrs_somconnexio.otrs_models.provision_ticket.ProvisionArticle")
|
|
40
40
|
def test_build_article(self, MockProvisionArticle):
|
|
41
|
-
mobile_data = Mock(spec=["order_id", "technology"])
|
|
41
|
+
mobile_data = Mock(spec=["order_id", "technology", "notes"])
|
|
42
42
|
mobile_data.order_id = 123
|
|
43
43
|
|
|
44
44
|
customer_data = Mock(spec=["order_id"])
|
|
45
45
|
|
|
46
46
|
mock_mobile_article = MockProvisionArticle.return_value
|
|
47
47
|
|
|
48
|
-
MobileTicket(mobile_data, customer_data, self.responsible_data)
|
|
48
|
+
ticket = MobileTicket(mobile_data, customer_data, self.responsible_data)
|
|
49
|
+
ticket._build_article()
|
|
49
50
|
|
|
50
|
-
MockProvisionArticle.
|
|
51
|
-
|
|
51
|
+
MockProvisionArticle.assert_called_once_with(
|
|
52
|
+
ticket._ticket_title(), mobile_data.notes
|
|
52
53
|
)
|
|
53
54
|
mock_mobile_article.call.assert_called_once()
|
|
54
55
|
|
|
@@ -138,3 +139,12 @@ class MobileTicketTestCase(unittest.TestCase):
|
|
|
138
139
|
|
|
139
140
|
self.assertEqual(ticket.id, 123)
|
|
140
141
|
self.assertEqual(ticket.number, "#123")
|
|
142
|
+
|
|
143
|
+
def test_files_to_attach_no_attachments(self):
|
|
144
|
+
customer_data = Mock()
|
|
145
|
+
service_data = Mock()
|
|
146
|
+
|
|
147
|
+
ticket = MobileTicket(service_data, customer_data, self.responsible_data)
|
|
148
|
+
attachments = ticket._files_to_attach()
|
|
149
|
+
|
|
150
|
+
self.assertFalse(attachments)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# coding: utf-8
|
|
2
2
|
import unittest
|
|
3
|
-
from mock import
|
|
3
|
+
from mock import patch
|
|
4
4
|
|
|
5
5
|
from otrs_somconnexio.otrs_models.provision_article import ProvisionArticle
|
|
6
6
|
|
|
@@ -8,42 +8,25 @@ from otrs_somconnexio.otrs_models.provision_article import ProvisionArticle
|
|
|
8
8
|
class ProvisionArticleTestCase(unittest.TestCase):
|
|
9
9
|
@patch("otrs_somconnexio.otrs_models.abstract_article.Article")
|
|
10
10
|
def test_call_with_notes(self, MockArticle):
|
|
11
|
-
|
|
11
|
+
subject = "test subject"
|
|
12
|
+
notes = "test notes"
|
|
12
13
|
expected_article_arguments = {
|
|
13
|
-
"Subject":
|
|
14
|
-
"Body":
|
|
14
|
+
"Subject": subject,
|
|
15
|
+
"Body": notes,
|
|
15
16
|
"ContentType": "text/plain; charset=utf8",
|
|
16
17
|
"IsVisibleForCustomer": "0",
|
|
17
18
|
}
|
|
18
|
-
ProvisionArticle(
|
|
19
|
-
service_type="adsl", technology="a", order_id="b", notes="c"
|
|
20
|
-
).call()
|
|
19
|
+
ProvisionArticle(subject=subject, notes=notes).call()
|
|
21
20
|
MockArticle.assert_called_once_with(expected_article_arguments)
|
|
22
21
|
|
|
23
22
|
@patch("otrs_somconnexio.otrs_models.abstract_article.Article")
|
|
24
23
|
def test_call_without_notes(self, MockArticle):
|
|
25
|
-
|
|
24
|
+
subject = "test subject"
|
|
26
25
|
expected_article_arguments = {
|
|
27
|
-
"Subject":
|
|
26
|
+
"Subject": subject,
|
|
28
27
|
"Body": "",
|
|
29
28
|
"ContentType": "text/plain; charset=utf8",
|
|
30
29
|
"IsVisibleForCustomer": "1",
|
|
31
30
|
}
|
|
32
|
-
ProvisionArticle(
|
|
33
|
-
service_type="fiber", technology="a", order_id="b", notes=""
|
|
34
|
-
).call()
|
|
35
|
-
MockArticle.assert_called_once_with(expected_article_arguments)
|
|
36
|
-
|
|
37
|
-
@patch("otrs_somconnexio.otrs_models.abstract_article.Article")
|
|
38
|
-
def test_call_mixed(self, MockArticle):
|
|
39
|
-
|
|
40
|
-
expected_article_arguments = {
|
|
41
|
-
"Subject": "Ticket#b - Mòbil mixta",
|
|
42
|
-
"Body": "c",
|
|
43
|
-
"ContentType": "text/plain; charset=utf8",
|
|
44
|
-
"IsVisibleForCustomer": "0",
|
|
45
|
-
}
|
|
46
|
-
ProvisionArticle(
|
|
47
|
-
service_type="mobile", technology="Mixta", order_id="b", notes="c"
|
|
48
|
-
).call()
|
|
31
|
+
ProvisionArticle(subject=subject, notes="").call()
|
|
49
32
|
MockArticle.assert_called_once_with(expected_article_arguments)
|
|
@@ -15,7 +15,7 @@ class Router4GTicketTestCase(unittest.TestCase):
|
|
|
15
15
|
@patch("otrs_somconnexio.otrs_models.provision_ticket.Ticket")
|
|
16
16
|
def test_build_ticket(self, MockTicket):
|
|
17
17
|
customer_data = Mock(spec=["id"])
|
|
18
|
-
service_data = Mock(spec=["order_id", "technology"])
|
|
18
|
+
service_data = Mock(spec=["order_id", "technology", "notes"])
|
|
19
19
|
|
|
20
20
|
expected_ticket_arguments = {
|
|
21
21
|
"Title": "Ticket#{} - Només 4G".format(service_data.order_id),
|
|
@@ -36,20 +36,19 @@ class Router4GTicketTestCase(unittest.TestCase):
|
|
|
36
36
|
MockTicket.assert_called_with(expected_ticket_arguments)
|
|
37
37
|
|
|
38
38
|
@patch("otrs_somconnexio.otrs_models.provision_ticket.ProvisionArticle")
|
|
39
|
-
def test_build_article(self,
|
|
39
|
+
def test_build_article(self, MockProvisionArticle):
|
|
40
40
|
customer_data = Mock(spec=[])
|
|
41
|
-
service_data = Mock(spec=["order_id", "technology"])
|
|
41
|
+
service_data = Mock(spec=["order_id", "technology", "notes"])
|
|
42
42
|
|
|
43
|
-
|
|
43
|
+
mock_provision_article = MockProvisionArticle.return_value
|
|
44
44
|
|
|
45
|
-
Router4GTicket(
|
|
46
|
-
|
|
47
|
-
)._build_article()
|
|
45
|
+
ticket = Router4GTicket(service_data, customer_data, self.responsible_data)
|
|
46
|
+
ticket._build_article()
|
|
48
47
|
|
|
49
|
-
|
|
50
|
-
|
|
48
|
+
MockProvisionArticle.assert_called_once_with(
|
|
49
|
+
ticket._ticket_title(), service_data.notes
|
|
51
50
|
)
|
|
52
|
-
|
|
51
|
+
mock_provision_article.call.assert_called_once()
|
|
53
52
|
|
|
54
53
|
@patch("otrs_somconnexio.otrs_models.router_4G_ticket.Router4GDynamicFields")
|
|
55
54
|
def test_build_dynamic_fields(self, MockRouter4GDynamicFields):
|
|
@@ -133,3 +132,12 @@ class Router4GTicketTestCase(unittest.TestCase):
|
|
|
133
132
|
|
|
134
133
|
self.assertEqual(ticket.id, 123)
|
|
135
134
|
self.assertEqual(ticket.number, "#123")
|
|
135
|
+
|
|
136
|
+
def test_files_to_attach_no_attachments(self):
|
|
137
|
+
customer_data = Mock()
|
|
138
|
+
service_data = Mock()
|
|
139
|
+
|
|
140
|
+
ticket = Router4GTicket(service_data, customer_data, self.responsible_data)
|
|
141
|
+
attachments = ticket._files_to_attach()
|
|
142
|
+
|
|
143
|
+
self.assertFalse(attachments)
|
|
@@ -40,20 +40,21 @@ class SwitchboardHeaderTicketTestCase(unittest.TestCase):
|
|
|
40
40
|
|
|
41
41
|
@patch("otrs_somconnexio.otrs_models.provision_ticket.ProvisionArticle")
|
|
42
42
|
def test_build_article(self, MockProvisionArticle):
|
|
43
|
-
service_data = Mock(spec=["order_id", "technology"])
|
|
43
|
+
service_data = Mock(spec=["order_id", "technology", "lead_line_data"])
|
|
44
44
|
service_data.order_id = 123
|
|
45
|
+
service_data.lead_line_data = {}
|
|
45
46
|
customer_data = Mock(spec=["order_id"])
|
|
46
47
|
|
|
47
48
|
mock_article = MockProvisionArticle.return_value
|
|
48
49
|
|
|
49
|
-
SwitchboardHeaderTicket(
|
|
50
|
+
ticket = SwitchboardHeaderTicket(
|
|
50
51
|
service_data, customer_data, self.responsible_data
|
|
51
|
-
)
|
|
52
|
+
)
|
|
53
|
+
ticket._build_article()
|
|
52
54
|
|
|
53
55
|
MockProvisionArticle.assert_called_with(
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
"switchboard_header",
|
|
56
|
+
ticket._ticket_title(),
|
|
57
|
+
ticket._format_lead_line_data(),
|
|
57
58
|
)
|
|
58
59
|
mock_article.call.assert_called_once()
|
|
59
60
|
|
|
@@ -90,6 +91,8 @@ class SwitchboardHeaderTicketTestCase(unittest.TestCase):
|
|
|
90
91
|
"previous_owner_name",
|
|
91
92
|
"previous_owner_surname",
|
|
92
93
|
"sales_team",
|
|
94
|
+
"agent_data",
|
|
95
|
+
"lead_line_data",
|
|
93
96
|
"type",
|
|
94
97
|
"notes",
|
|
95
98
|
]
|
|
@@ -108,6 +111,8 @@ class SwitchboardHeaderTicketTestCase(unittest.TestCase):
|
|
|
108
111
|
"language",
|
|
109
112
|
]
|
|
110
113
|
)
|
|
114
|
+
service_data.agent_data = []
|
|
115
|
+
service_data.lead_line_data = {}
|
|
111
116
|
|
|
112
117
|
mock_otrs_client = Mock(spec=["create_otrs_process_ticket"])
|
|
113
118
|
mock_otrs_client.create_otrs_process_ticket.return_value = Mock(
|
|
@@ -125,3 +130,76 @@ class SwitchboardHeaderTicketTestCase(unittest.TestCase):
|
|
|
125
130
|
mock_otrs_client.create_otrs_process_ticket.assert_called_once()
|
|
126
131
|
self.assertEqual(ticket.id, 123)
|
|
127
132
|
self.assertEqual(ticket.number, "#123")
|
|
133
|
+
|
|
134
|
+
def test_files_to_attach(self):
|
|
135
|
+
service_data = Mock(spec=["order_id", "agent_data"])
|
|
136
|
+
customer_data = Mock()
|
|
137
|
+
service_data.order_id = 123
|
|
138
|
+
service_data.agent_data = [
|
|
139
|
+
{
|
|
140
|
+
"product": "product1",
|
|
141
|
+
"extension": "ext1",
|
|
142
|
+
"agent_name": "agent1",
|
|
143
|
+
"agent_email": "agent1@test.com",
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
"product": "product2",
|
|
147
|
+
"extension": "ext2",
|
|
148
|
+
"agent_name": "agent2",
|
|
149
|
+
"agent_email": "agent2@test.com",
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
"product": "product3",
|
|
153
|
+
"extension": "ext3",
|
|
154
|
+
"agent_name": "agent3",
|
|
155
|
+
"agent_email": "agent3@test.com",
|
|
156
|
+
},
|
|
157
|
+
]
|
|
158
|
+
|
|
159
|
+
sb_header_ticket = SwitchboardHeaderTicket(
|
|
160
|
+
service_data, customer_data, self.responsible_data
|
|
161
|
+
)
|
|
162
|
+
files = sb_header_ticket._files_to_attach()
|
|
163
|
+
|
|
164
|
+
self.assertEqual(len(files), 1)
|
|
165
|
+
agent_data_file = files[0]
|
|
166
|
+
self.assertEqual(
|
|
167
|
+
agent_data_file["Filename"],
|
|
168
|
+
"importació_agents_operator_{}.txt".format(service_data.order_id),
|
|
169
|
+
)
|
|
170
|
+
self.assertIn("product1:\n", agent_data_file["Content"])
|
|
171
|
+
self.assertIn(
|
|
172
|
+
"ext1\tagent1\t2424\tagent1\tagent1@test.com\n", agent_data_file["Content"]
|
|
173
|
+
)
|
|
174
|
+
self.assertIn("product2:\n", agent_data_file["Content"])
|
|
175
|
+
self.assertIn(
|
|
176
|
+
"ext2\tagent2\t2424\tagent2\tagent2@test.com\n", agent_data_file["Content"]
|
|
177
|
+
)
|
|
178
|
+
self.assertIn("product3:\n", agent_data_file["Content"])
|
|
179
|
+
self.assertIn(
|
|
180
|
+
"ext3\tagent3\t2424\tagent3\tagent3@test.com\n", agent_data_file["Content"]
|
|
181
|
+
)
|
|
182
|
+
|
|
183
|
+
def test_format_lead_line_data(self):
|
|
184
|
+
service_data = Mock(spec=["order_id", "lead_line_data"])
|
|
185
|
+
customer_data = Mock()
|
|
186
|
+
service_data.order_id = 123
|
|
187
|
+
service_data.lead_line_data = {
|
|
188
|
+
"Prod": ["product1", "product2", "product3"],
|
|
189
|
+
"Ext": ["ext1", "ext2", "ext3"],
|
|
190
|
+
"Nom": ["agent1", "agent2", "agent3"],
|
|
191
|
+
"Telf": ["111", "222", "333"],
|
|
192
|
+
"Tipus": ["tipus1", "tipus2", "tipus3"],
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
sb_header_ticket = SwitchboardHeaderTicket(
|
|
196
|
+
service_data, customer_data, self.responsible_data
|
|
197
|
+
)
|
|
198
|
+
lead_line_table = sb_header_ticket._format_lead_line_data()
|
|
199
|
+
|
|
200
|
+
for header in service_data.lead_line_data.keys():
|
|
201
|
+
self.assertIn(header, lead_line_table)
|
|
202
|
+
self.assertEqual(
|
|
203
|
+
lead_line_table.count("\n"),
|
|
204
|
+
len(service_data.lead_line_data["Prod"]) + 1,
|
|
205
|
+
) # headers + number of rows
|
|
@@ -12,7 +12,7 @@ class SwitchboardTicketTestCase(unittest.TestCase):
|
|
|
12
12
|
def setUp(self):
|
|
13
13
|
self.responsible_data = Mock(spec=["email"])
|
|
14
14
|
self.service_data = Mock(
|
|
15
|
-
spec=["order_id", "technology", "landline", "mobile_phone_number"]
|
|
15
|
+
spec=["order_id", "technology", "landline", "mobile_phone_number", "notes"]
|
|
16
16
|
)
|
|
17
17
|
self.service_data.order_id = 123
|
|
18
18
|
self.customer_data = Mock(spec=["id"])
|
|
@@ -59,13 +59,14 @@ class SwitchboardTicketTestCase(unittest.TestCase):
|
|
|
59
59
|
def test_build_article(self, MockProvisionArticle):
|
|
60
60
|
mock_article = MockProvisionArticle.return_value
|
|
61
61
|
|
|
62
|
-
SwitchboardTicket(
|
|
62
|
+
ticket = SwitchboardTicket(
|
|
63
63
|
self.service_data, self.customer_data, self.responsible_data
|
|
64
|
-
)
|
|
64
|
+
)
|
|
65
|
+
ticket._build_article()
|
|
66
|
+
|
|
65
67
|
MockProvisionArticle.assert_called_with(
|
|
66
|
-
|
|
67
|
-
self.service_data.
|
|
68
|
-
"switchboard",
|
|
68
|
+
ticket._ticket_title(),
|
|
69
|
+
self.service_data.notes,
|
|
69
70
|
)
|
|
70
71
|
mock_article.call.assert_called_once()
|
|
71
72
|
|
|
File without changes
|
|
File without changes
|