imio.smartweb.core 1.1.28__py3-none-any.whl → 1.1.29__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.
@@ -25,6 +25,13 @@ class IDirectoryView(model.Schema):
25
25
  title=_("Number of items to display"), default=20, required=True
26
26
  )
27
27
 
28
+ display_map = schema.Bool(
29
+ title=_("Display map"),
30
+ description=_("If selected, map will be displayed"),
31
+ required=False,
32
+ default=True,
33
+ )
34
+
28
35
 
29
36
  @implementer(IDirectoryView)
30
37
  class DirectoryView(Container):
@@ -8,7 +8,8 @@
8
8
  query-filter-url view/local_filters_query_url;
9
9
  batch-size view/batch_size;
10
10
  propose-url view/propose_url;
11
- current-language view/get_current_language;"></smartweb-annuaire>
11
+ current-language view/get_current_language;
12
+ display_map view/display_map;"></smartweb-annuaire>
12
13
  </div>
13
14
  </metal:main>
14
15
  </body>
@@ -10,3 +10,7 @@ class DirectoryViewView(BaseRestView):
10
10
  @property
11
11
  def propose_url(self):
12
12
  return api.portal.get_registry_record("smartweb.propose_directory_url")
13
+
14
+ @property
15
+ def display_map(self):
16
+ return self.context.display_map
@@ -30,6 +30,13 @@ class IEventsView(model.Schema):
30
30
  title=_("Number of items to display"), default=20, required=True
31
31
  )
32
32
 
33
+ display_map = schema.Bool(
34
+ title=_("Display map"),
35
+ description=_("If selected, map will be displayed"),
36
+ required=False,
37
+ default=True,
38
+ )
39
+
33
40
 
34
41
  @implementer(IEventsView)
35
42
  class EventsView(Container):
@@ -9,7 +9,8 @@
9
9
  query-filter-url view/local_filters_query_url;
10
10
  batch-size view/batch_size;
11
11
  propose-url view/propose_url;
12
- current-language view/get_current_language;"></smartweb-events>
12
+ current-language view/get_current_language;
13
+ display_map view/display_map;"></smartweb-events>
13
14
  </div>
14
15
  </metal:main>
15
16
  </body>
@@ -10,3 +10,7 @@ class EventsViewView(BaseRestView):
10
10
  @property
11
11
  def propose_url(self):
12
12
  return api.portal.get_registry_record("smartweb.propose_events_url")
13
+
14
+ @property
15
+ def display_map(self):
16
+ return self.context.display_map
@@ -24,7 +24,7 @@
24
24
  <p tal:replace="structure context/@@description" />
25
25
 
26
26
  <div tal:define="collapse_klass python: 'collapse' if context.collapsible_section else ''"
27
- tal:attributes="class string:body-section ratio ratio-16x9 ${collapse_klass};
27
+ tal:attributes="class string:body-section ratio ${collapse_klass};
28
28
  id string:body-section-${context/id}"
29
29
  tal:content="structure view/get_embed_external_content" />
30
30
 
@@ -23,6 +23,7 @@ class ExternalContentView(SectionView):
23
23
  EllohaPlugin(),
24
24
  CognitoformPlugin(),
25
25
  ArcgisPlugin(),
26
+ GiveADayPlugin(),
26
27
  UnknowServicePlugin(),
27
28
  ]
28
29
  extra_params = self.context.external_content_params
@@ -44,6 +45,7 @@ class ExternalContentView(SectionView):
44
45
  "current_lang": current_lang,
45
46
  "extra_params": extra_params,
46
47
  },
48
+ "giveadayplugin": {},
47
49
  "unknowserviceplugin": {"width": width, "current_lang": current_lang},
48
50
  }
49
51
  embedder = Embedder(plugins=plugins, plugin_config=plugin_config)
@@ -63,11 +65,11 @@ class ExternalContentView(SectionView):
63
65
 
64
66
  class EaglebePlugin(Plugin):
65
67
  def __call__(self, parts, config={}):
66
- if "app.eaglebe.com" in parts.netloc:
67
- return f'<iframe class="eaglebe" src="{parts.geturl()}" scrolling="no" width="{config["width"]}">'
68
- #
69
68
  return None
70
69
 
70
+ # if "app.eaglebe.com" in parts.netloc:
71
+ # return f'<iframe class="eaglebe" src="{parts.geturl()}" scrolling="no" width="{config["width"]}">'
72
+
71
73
 
72
74
  class EllohaPlugin(Plugin):
73
75
  def __call__(self, parts, config={}):
@@ -193,6 +195,22 @@ class ArcgisPlugin(Plugin):
193
195
  return None
194
196
 
195
197
 
198
+ class GiveADayPlugin(Plugin):
199
+ def __call__(self, parts, config={}):
200
+ if "www.giveaday.be" in parts.netloc:
201
+ return (
202
+ '<div id="giveaday-widget"></div>'
203
+ "<script src=https://www.giveaday.be/assets/giveaday_v1.js></script>"
204
+ "<script>"
205
+ "function renderWidget() {"
206
+ 'giveADayWidget.initialize("giveaday-widget", 2924, "organization", "large", "fr","#34B78F");}'
207
+ "renderWidget();"
208
+ "</script>"
209
+ )
210
+ #
211
+ return None
212
+
213
+
196
214
  class UnknowServicePlugin(Plugin):
197
215
  def __call__(self, parts, config={}):
198
216
  current_lang = config["current_lang"]
@@ -347,3 +347,22 @@ class SectionsFunctionalTest(ImioSmartwebTestCase):
347
347
  self.assertEqual(
348
348
  patch_selected_news_folders, response_selected_news_folders
349
349
  )
350
+
351
+ def test_display_map(self):
352
+ self.rest_directory = api.content.create(
353
+ container=self.portal,
354
+ type="imio.smartweb.DirectoryView",
355
+ title="directory view",
356
+ )
357
+ self.rest_directory.display_map = True
358
+ view = queryMultiAdapter((self.rest_directory, self.request), name="view")
359
+ self.assertIn('display_map="True"', view())
360
+
361
+ self.rest_events = api.content.create(
362
+ container=self.portal,
363
+ type="imio.smartweb.EventsView",
364
+ title="events view",
365
+ )
366
+ self.rest_events.display_map = True
367
+ view = queryMultiAdapter((self.rest_events, self.request), name="view")
368
+ self.assertIn('display_map="True"', view())
@@ -32,24 +32,24 @@ class TestSectionExternalContent(ImioSmartwebTestCase):
32
32
  '<p class="unknow_service">Unknow service</p>',
33
33
  )
34
34
 
35
- def test_eaglebe_plugin(self):
36
- sec = api.content.create(
37
- container=self.page, type="imio.smartweb.SectionExternalContent", id="sec"
38
- )
35
+ # def test_eaglebe_plugin(self):
36
+ # sec = api.content.create(
37
+ # container=self.page, type="imio.smartweb.SectionExternalContent", id="sec"
38
+ # )
39
39
 
40
- sec.external_content_url = ""
41
- section_view = queryMultiAdapter((sec, self.request), name="view")
42
- self.assertEqual(
43
- section_view.get_embed_external_content(),
44
- '<p class="unknow_service">Unknow service</p>',
45
- )
40
+ # sec.external_content_url = ""
41
+ # section_view = queryMultiAdapter((sec, self.request), name="view")
42
+ # self.assertEqual(
43
+ # section_view.get_embed_external_content(),
44
+ # '<p class="unknow_service">Unknow service</p>',
45
+ # )
46
46
 
47
- sec.external_content_url = "https://app.eaglebe.com/auth/start"
48
- section_view = queryMultiAdapter((sec, self.request), name="view")
49
- self.assertEqual(
50
- section_view.get_embed_external_content(),
51
- '<iframe class="eaglebe" src="https://app.eaglebe.com/auth/start" scrolling="no" width="100%">',
52
- )
47
+ # sec.external_content_url = "https://app.eaglebe.com/auth/start"
48
+ # section_view = queryMultiAdapter((sec, self.request), name="view")
49
+ # self.assertEqual(
50
+ # section_view.get_embed_external_content(),
51
+ # '<iframe class="eaglebe" src="https://app.eaglebe.com/auth/start" scrolling="no" width="100%">',
52
+ # )
53
53
 
54
54
  def test_elloha_plugin(self):
55
55
  sec = api.content.create(
@@ -125,17 +125,17 @@ class TestSections(ImioSmartwebTestCase):
125
125
  type="imio.smartweb.SectionExternalContent",
126
126
  title="Section External Content",
127
127
  )
128
- section.external_content_url = (
129
- "https://app.eaglebe.com/fr-be/map/la%20louvi%C3%A8re"
130
- )
131
- view = queryMultiAdapter((section, self.request), name="view")
132
- embedded_content = view.get_embed_external_content()
133
- self.assertIn("iframe", embedded_content)
134
- self.assertIn('class="eaglebe"', embedded_content)
135
- self.assertIn('scrolling="no"', embedded_content)
136
- self.assertIn(
137
- "https://app.eaglebe.com/fr-be/map/la%20louvi%C3%A8re", embedded_content
138
- )
128
+ # section.external_content_url = (
129
+ # "https://app.eaglebe.com/fr-be/map/la%20louvi%C3%A8re"
130
+ # )
131
+ # view = queryMultiAdapter((section, self.request), name="view")
132
+ # embedded_content = view.get_embed_external_content()
133
+ # self.assertIn("iframe", embedded_content)
134
+ # self.assertIn('class="eaglebe"', embedded_content)
135
+ # self.assertIn('scrolling="no"', embedded_content)
136
+ # self.assertIn(
137
+ # "https://app.eaglebe.com/fr-be/map/la%20louvi%C3%A8re", embedded_content
138
+ # )
139
139
 
140
140
  section.external_content_url = "http://www.perdu.com"
141
141
  view = queryMultiAdapter((section, self.request), name="view")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: imio.smartweb.core
3
- Version: 1.1.28
3
+ Version: 1.1.29
4
4
  Summary: Core product for iMio websites
5
5
  Home-page: https://github.com/imio/imio.smartweb.core
6
6
  Author: Christophe Boulanger
@@ -189,6 +189,17 @@ Changelog
189
189
  =========
190
190
 
191
191
 
192
+ 1.1.29 (2023-10-18)
193
+ -------------------
194
+
195
+ - SUP-32814 : Add new external content plugins : GiveADayPlugin
196
+ see : https://github.com/IMIO/imio.smartweb.core/commit/a4dfca2
197
+ [boulch]
198
+
199
+ - WEB-4000 : Add display_map Bool field on directory and events views
200
+ [boulch]
201
+
202
+
192
203
  1.1.28 (2023-10-13)
193
204
  -------------------
194
205
 
@@ -1,4 +1,4 @@
1
- imio.smartweb.core-1.1.28-py3.10-nspkg.pth,sha256=wnCUSUElqssZ5FI3x-9HqwD229HQ-bAuPoDUNJHmMtU,1684
1
+ imio.smartweb.core-1.1.29-py3.10-nspkg.pth,sha256=wnCUSUElqssZ5FI3x-9HqwD229HQ-bAuPoDUNJHmMtU,1684
2
2
  imio/smartweb/core/__init__.py,sha256=iwhKnzeBJLKxpRVjvzwiRE63_zNpIBfaKLITauVph-0,24
3
3
  imio/smartweb/core/config.py,sha256=BUgfvh4hCaw0onCYAG4gQI1O4hZ-GzXWEltdHi4YLIs,337
4
4
  imio/smartweb/core/configure.zcml,sha256=G_Txh8wh0Mt5g2nDrJUjec_qFd5l9A8ZEUFzv4cjUcA,1429
@@ -193,16 +193,16 @@ imio/smartweb/core/contents/rest/configure.zcml,sha256=Cq0d5n2-XZZr7DD8BjQyjOFkp
193
193
  imio/smartweb/core/contents/rest/view.py,sha256=kaNmJZ7FbB-HE632bfITo-ZrjNGBqKhGuChmPoOmv6Y,706
194
194
  imio/smartweb/core/contents/rest/directory/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
195
195
  imio/smartweb/core/contents/rest/directory/configure.zcml,sha256=_K34jECLk9RWscAyiRXwoJLLBIVj-EJRGFOEbUU5Ito,1035
196
- imio/smartweb/core/contents/rest/directory/content.py,sha256=c3XmsOXVp9Zx30DeljuCbkaSJVhdqBRb5M2FKYaaokE,923
196
+ imio/smartweb/core/contents/rest/directory/content.py,sha256=zjNHSJeVr5vijEJ3LSuL-9UjaU6Gm_Ztl4svkYpGAUw,1100
197
197
  imio/smartweb/core/contents/rest/directory/endpoint.py,sha256=DJf0fdu66VEt2gwO-l1Bqf_Y6RtXhs4SG7OvkbEGQN0,2784
198
- imio/smartweb/core/contents/rest/directory/view.pt,sha256=6J6LPZSQ4Aq4SQV2Bukvm-oNgljvAqpknaSLa_3m-hc,616
199
- imio/smartweb/core/contents/rest/directory/view.py,sha256=ZWNstnjoCWaadqo3V2m8-GOb4pyXEpBvWsD4R95lGlo,302
198
+ imio/smartweb/core/contents/rest/directory/view.pt,sha256=H3ApKuIpJkljCs7ol97p8FARTJTJiOPMYmhJCz-pfwA,685
199
+ imio/smartweb/core/contents/rest/directory/view.py,sha256=oW-RJvldZOHd4xHCPtwienk99rZPNV_q9bwUVVgYlJM,384
200
200
  imio/smartweb/core/contents/rest/events/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
201
201
  imio/smartweb/core/contents/rest/events/configure.zcml,sha256=ufUHdGMkGd57zgZ4_DxvoK4Zn7_AC_A3_TnLkmdYRhs,1017
202
- imio/smartweb/core/contents/rest/events/content.py,sha256=AUup2Qf47hP7_qB0WS3M7_dzmL1YpRWySz5MGLSSz50,1100
202
+ imio/smartweb/core/contents/rest/events/content.py,sha256=UF5o1KSlUhymQUK_jqX7VIoUZrAs5IkGTy_tPSXGveU,1277
203
203
  imio/smartweb/core/contents/rest/events/endpoint.py,sha256=s0PHrAxIv2thBTHsuHbjjSdwqnWOZbhZz8DNk-vqn10,2561
204
- imio/smartweb/core/contents/rest/events/view.pt,sha256=0nT6iPXHIYMEtTGCVbvFtIhs_wc8rpbbs4_bYnOFiuQ,617
205
- imio/smartweb/core/contents/rest/events/view.py,sha256=hiHjL93lRP_hb-xa2t9cpGGz67jo3Y5ssFpV-F2eXtM,293
204
+ imio/smartweb/core/contents/rest/events/view.pt,sha256=zOqZbykUq73cIp_IMg2jFprZ5EHSZ5ViK9P4TlUk3GU,686
205
+ imio/smartweb/core/contents/rest/events/view.py,sha256=cNEor3E5kVtqGURtMYS2JZETcpXuIx3PA-IVcr_ejuA,375
206
206
  imio/smartweb/core/contents/rest/news/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
207
207
  imio/smartweb/core/contents/rest/news/configure.zcml,sha256=f1kNWMjcHul5_dKv51KY_GQII-Cvx-uL7N9Z25zlN8c,1005
208
208
  imio/smartweb/core/contents/rest/news/content.py,sha256=i2duKDXViZwOnzS1h8vKkGxejlbRJ4zGtkUIsybtonc,753
@@ -240,9 +240,9 @@ imio/smartweb/core/contents/sections/events/view.py,sha256=nTwRUB4KRYHGejG0AVD7a
240
240
  imio/smartweb/core/contents/sections/external_content/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
241
241
  imio/smartweb/core/contents/sections/external_content/configure.zcml,sha256=fv5_EgtBz4Ecnia8zgxwASnuxRmh6dXLJPncmR0BC-U,727
242
242
  imio/smartweb/core/contents/sections/external_content/content.py,sha256=apHtfPwxkHkLQJVFVXs4F8O0gE09uI49AFQ8xRFrXgo,1096
243
- imio/smartweb/core/contents/sections/external_content/view.pt,sha256=ejEDippSIyEZN4QbjnMgPUk89D6eGkf3DMpwqTlDHjk,1245
243
+ imio/smartweb/core/contents/sections/external_content/view.pt,sha256=_HwDoyytZrcq_IMXuRxakr54XgjXRNYScZumSA50FEA,1234
244
244
  imio/smartweb/core/contents/sections/external_content/view_arcgis.pt,sha256=mWxeEI6gWAIHixV0dIt6JnEPCEEYqsJklA3V9nGXFTw,4895
245
- imio/smartweb/core/contents/sections/external_content/views.py,sha256=MLKSEfndvQxZdbXu6P-3A2gA0d1pgWLDZeD5fH98SQw,8139
245
+ imio/smartweb/core/contents/sections/external_content/views.py,sha256=yeVUEifvoBGkjTLrpVz1PvNpsmiWjql9DvQnnJWR6zg,8764
246
246
  imio/smartweb/core/contents/sections/files/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
247
247
  imio/smartweb/core/contents/sections/files/configure.zcml,sha256=DyyHzDEKLWmOywbV08Zf7bvf0At5jyAeDfZ8PCK5Rog,501
248
248
  imio/smartweb/core/contents/sections/files/content.py,sha256=3WHAdqNxV_L30EdtCpfHjlnaKIjZunZFRLpwmREJFi0,868
@@ -380,15 +380,15 @@ imio/smartweb/core/tests/test_page.py,sha256=1dD9M_6nwS6M2OuyWmT5cPq5qnxnog3tcqF
380
380
  imio/smartweb/core/tests/test_plausibleview.py,sha256=G1ryfnz3TuQBG8VFO5KzEylT5DFABW58PQuuvPq_ccY,3229
381
381
  imio/smartweb/core/tests/test_portal_page.py,sha256=hIqg4eb91o8BsSj7eSKdvoxehzOXt8bzpg1o5ej__zg,7215
382
382
  imio/smartweb/core/tests/test_procedure.py,sha256=0w8phOwYfpp9vb3KDsnwjX8AhQXWdodA06W4koderQo,6474
383
- imio/smartweb/core/tests/test_rest.py,sha256=t43LJfl0W1suebEDtZ2LlBvOL-So32SPdRtoV3U0ahY,13858
383
+ imio/smartweb/core/tests/test_rest.py,sha256=JeHLX1mnUzJSvhpGJWDvN8y-YGy2im4k-EdRkMXJ8Ls,14599
384
384
  imio/smartweb/core/tests/test_robot.py,sha256=NQ7AkN4tEva3bgGjMxmyqY0zIo4pJPnPOwnD9hmrTVI,926
385
385
  imio/smartweb/core/tests/test_search.py,sha256=VryeRI4_5CvnStKOoNoG95M2WTy7Lyy_AhHIDG40M14,2182
386
386
  imio/smartweb/core/tests/test_section_contact.py,sha256=C1pSm49aKaOeCEEfeWkM5DEwP4gk02l0GQHp8yqDYpU,21264
387
387
  imio/smartweb/core/tests/test_section_events.py,sha256=H7vw84NAUgBr3Cnbb0ZMLdi1xvg8_mU2Y2E2JQEAV5c,5609
388
- imio/smartweb/core/tests/test_section_external_content.py,sha256=sWamDvmJIyFTM__u23isQglO0uaFXNHHLZxXm0yS9HQ,6840
388
+ imio/smartweb/core/tests/test_section_external_content.py,sha256=rKxVc03Z7atkkLEVG_kergdK5F3MN5h9PQtmOEd6Q04,6872
389
389
  imio/smartweb/core/tests/test_section_news.py,sha256=FhuerS1a4sppGwswUXaQ6hw_BOMjb79_pzrF5B5FciY,5760
390
390
  imio/smartweb/core/tests/test_section_sendinblue.py,sha256=UmmKo33T9feelumxqeejM4HG4oLRPKJkbB8hkLO144E,2661
391
- imio/smartweb/core/tests/test_sections.py,sha256=WZm0k2fyGAPNcnKUsjGjoHBsOBjcRPU5BuM3vszpxWI,23669
391
+ imio/smartweb/core/tests/test_sections.py,sha256=5FDV59KMsdWMIBtqE4_r9ujnwURfPP860kNSXmapNj8,23691
392
392
  imio/smartweb/core/tests/test_setup.py,sha256=JcbMnXTNCuB_8grFh5E1kZ0uALdATlKMbahAdGfToZI,2092
393
393
  imio/smartweb/core/tests/test_social.py,sha256=THsk3PrUrjV4nPK-DDRRBnItMBr3TVuXExSucd0n79k,3030
394
394
  imio/smartweb/core/tests/test_subsite.py,sha256=wiD8Ke4_-ArstSYNLCs8ArqOuDx2xxUR6Wac3GXfnbE,9016
@@ -663,10 +663,10 @@ imio/smartweb/core/webcomponents/src/hooks/useAxios.js,sha256=MsRpT8p9bZTp2Hk2sc
663
663
  imio/smartweb/core/webcomponents/src/hooks/useFilterQuery.js,sha256=fGxgxCI22ERSlVLCYmD0-nztnGUIz-VkUNyLtj5HSuo,223
664
664
  imio/smartweb/core/webcomponents/src/utils/translation.js,sha256=bsTZTvRlBaCImAchnuhZLtLQYC06bM539cPLoAgBMP0,2694
665
665
  imio/smartweb/core/webcomponents/src/utils/url.js,sha256=iyl_1QXfPBgUn0LEbZYT_zMEEjmj5DMiEz44Z6AKLcg,244
666
- imio.smartweb.core-1.1.28.dist-info/LICENSE.GPL,sha256=gXf5dRMhNSbfLPYYTY_5hsZ1r7UU1OaKQEAQUhuIBkM,18092
667
- imio.smartweb.core-1.1.28.dist-info/LICENSE.rst,sha256=RzkMFz6AX3-cHd531zd2YQcXai8RIbjFWTs6m66Y5u4,653
668
- imio.smartweb.core-1.1.28.dist-info/METADATA,sha256=4hXKRSdZPiq88sv-bzWVU6ex_5gvKkcdYWDLSpLWhLY,41901
669
- imio.smartweb.core-1.1.28.dist-info/WHEEL,sha256=pkctZYzUS4AYVn6dJ-7367OJZivF2e8RA9b_ZBjif18,92
670
- imio.smartweb.core-1.1.28.dist-info/namespace_packages.txt,sha256=Pg8AH8t9viMMW1hJbNZvTy_n2jXG2igIYUpon5RA4Js,19
671
- imio.smartweb.core-1.1.28.dist-info/top_level.txt,sha256=ZktC0EGzThvMTAin9_q_41rzvvfMT2FYbP8pbhSLMSA,5
672
- imio.smartweb.core-1.1.28.dist-info/RECORD,,
666
+ imio.smartweb.core-1.1.29.dist-info/LICENSE.GPL,sha256=gXf5dRMhNSbfLPYYTY_5hsZ1r7UU1OaKQEAQUhuIBkM,18092
667
+ imio.smartweb.core-1.1.29.dist-info/LICENSE.rst,sha256=RzkMFz6AX3-cHd531zd2YQcXai8RIbjFWTs6m66Y5u4,653
668
+ imio.smartweb.core-1.1.29.dist-info/METADATA,sha256=y_U4K6L9BiFZSbtkOfryhUw4zKIyQrdEVvDNp5zAkvQ,42167
669
+ imio.smartweb.core-1.1.29.dist-info/WHEEL,sha256=pkctZYzUS4AYVn6dJ-7367OJZivF2e8RA9b_ZBjif18,92
670
+ imio.smartweb.core-1.1.29.dist-info/namespace_packages.txt,sha256=Pg8AH8t9viMMW1hJbNZvTy_n2jXG2igIYUpon5RA4Js,19
671
+ imio.smartweb.core-1.1.29.dist-info/top_level.txt,sha256=ZktC0EGzThvMTAin9_q_41rzvvfMT2FYbP8pbhSLMSA,5
672
+ imio.smartweb.core-1.1.29.dist-info/RECORD,,