Skip to content

Commit 1c97d34

Browse files
authored
Merge pull request #10 from nnnLik/feature/add-website-creation--v2
Add WebsitesManageV2 class for enhanced website management API
2 parents 7965194 + d6502ed commit 1c97d34

File tree

2 files changed

+298
-3
lines changed

2 files changed

+298
-3
lines changed

admitad/items/websites.py

Lines changed: 113 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66

77
__all__ = (
88
'Websites',
9-
'WebsitesManage'
9+
'WebsitesManage',
10+
'WebsitesManageV2'
1011
)
1112

1213

@@ -199,3 +200,114 @@ def delete(self, _id):
199200
}
200201

201202
return self.transport.post().request(**request_data)
203+
204+
205+
class WebsitesManageV2(Item):
206+
"""
207+
Manage websites using v2 API
208+
209+
"""
210+
211+
SCOPE = 'manage_websites'
212+
CREATE_URL = Item.prepare_url('websites/v2/create')
213+
UPDATE_URL = Item.prepare_url('websites/v2/update/%(website_id)s')
214+
VERIFY_URL = Item.prepare_url('websites/v2/verify/%(website_id)s')
215+
DELETE_URL = Item.prepare_url('websites/v2/delete/%(website_id)s')
216+
GET_URL = Item.prepare_url('websites/v2')
217+
GET_ONE_URL = Item.prepare_url('websites/v2/%(website_id)s')
218+
219+
CREATE_FIELDS = {
220+
'name': lambda x: Item.sanitize_string_value(x, 'name', max_length=200),
221+
'kind': lambda x: Item.sanitize_string_value(x, 'kind', max_length=20),
222+
'url': lambda x: Item.sanitize_string_value(x, 'url', max_length=255),
223+
'category': lambda x: Item.sanitize_integer_array(x, 'category'),
224+
'region': lambda x: Item.sanitize_string_array(x, 'region'),
225+
}
226+
227+
UPDATE_FIELDS = {
228+
'name': lambda x: Item.sanitize_string_value(x, 'name', max_length=200, blank=True),
229+
'url': lambda x: Item.sanitize_string_value(x, 'url', max_length=255, blank=True),
230+
}
231+
232+
def create(self, **kwargs: dict[str, int | str]) -> dict:
233+
"""
234+
Args:
235+
name (str) - website name
236+
kind (str) - website kind
237+
url (str) - website url
238+
category (list of int) - website categories
239+
region (list of str) - website regions
240+
241+
"""
242+
data = Item.sanitize_fields(self.CREATE_FIELDS, **kwargs)
243+
244+
return self.transport.post().set_data(data).request(url=self.CREATE_URL)
245+
246+
def update(self, _id: int, **kwargs: dict[str, int | str]) -> dict:
247+
"""
248+
Args:
249+
_id (int) - website id
250+
name (str) - website name
251+
url (str) - website url
252+
253+
"""
254+
data = Item.sanitize_fields(self.UPDATE_FIELDS, **kwargs)
255+
256+
request_data = {
257+
'url': self.UPDATE_URL,
258+
'website_id': Item.sanitize_id(_id)
259+
}
260+
261+
return self.transport.post().set_data(data).request(**request_data)
262+
263+
def verify(self, _id: int) -> dict:
264+
"""
265+
Args:
266+
_id (int) - website id
267+
268+
"""
269+
request_data = {
270+
'url': self.VERIFY_URL,
271+
'website_id': Item.sanitize_id(_id)
272+
}
273+
274+
return self.transport.post().request(**request_data)
275+
276+
def delete(self, _id: int) -> dict:
277+
"""
278+
Args:
279+
_id (int) - website id
280+
281+
"""
282+
request_data = {
283+
'url': self.DELETE_URL,
284+
'website_id': Item.sanitize_id(_id)
285+
}
286+
287+
return self.transport.post().request(**request_data)
288+
289+
def get(self, **kwargs: dict[str, int | str]) -> dict:
290+
"""
291+
Args:
292+
limit (int)
293+
offset (int)
294+
295+
"""
296+
return (
297+
self.transport.get()
298+
.set_pagination(**kwargs)
299+
.request(url=self.GET_URL)
300+
)
301+
302+
def getOne(self, _id: int, **_: dict[str, int | str]) -> dict:
303+
"""
304+
Args:
305+
_id (int) - website id
306+
307+
"""
308+
requests_data = {
309+
'url': self.GET_ONE_URL,
310+
'website_id': Item.sanitize_id(_id)
311+
}
312+
313+
return self.transport.get().request(**requests_data)

admitad/tests/test_websites.py

Lines changed: 185 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import unittest
55
import responses
66

7-
from admitad.items import Websites, WebsitesManage
7+
from admitad.items import Websites, WebsitesManage, WebsitesManageV2
88
from admitad.tests.base import BaseTestCase
99

1010

@@ -155,7 +155,7 @@ def test_create_website_request(self):
155155
'is_old': False,
156156
'mailing_targeting': True,
157157
'regions': ['RU'],
158-
'site_url': 'https://foobar.bar/',
158+
'site_url': 'https://foobar.baz/',
159159
'validation_passed': False,
160160
'verification_code': '244a5d4a14',
161161
'atnd_hits': 500,
@@ -264,5 +264,188 @@ def test_delete_website_request(self):
264264
self.assertIn('success', result)
265265

266266

267+
class WebsitesManageV2TestCase(BaseTestCase):
268+
269+
def test_create_website_request(self):
270+
with responses.RequestsMock() as resp:
271+
resp.add(
272+
resp.POST,
273+
self.prepare_url(WebsitesManageV2.CREATE_URL),
274+
match_querystring=True,
275+
json={
276+
'id': 30,
277+
'status': 'new',
278+
'kind': 'social_network_vk',
279+
'name': 'test website',
280+
'site_url': 'http://vk.com/xui',
281+
'verification_code': '074a583c47',
282+
'creation_date': '2025-08-28T12:54:24',
283+
'is_old': False,
284+
'account_id': '',
285+
'validation_passed': False,
286+
'is_lite': False,
287+
},
288+
status=200
289+
)
290+
291+
result = self.client.WebsitesManageV2.create(
292+
name='test website',
293+
kind='social_network_vk',
294+
url='http://vk.com/xui',
295+
category=[1, 2],
296+
region=['RU'],
297+
)
298+
299+
self.assertIn('id', result)
300+
self.assertIn('name', result)
301+
self.assertIn('status', result)
302+
self.assertIn('kind', result)
303+
self.assertIn('verification_code', result)
304+
self.assertIn('site_url', result)
305+
self.assertIn('creation_date', result)
306+
self.assertIn('is_old', result)
307+
self.assertIn('account_id', result)
308+
self.assertIn('validation_passed', result)
309+
self.assertIn('is_lite', result)
310+
311+
def test_update_website_request(self):
312+
with responses.RequestsMock() as resp:
313+
resp.add(
314+
resp.POST,
315+
self.prepare_url(WebsitesManageV2.UPDATE_URL, website_id=30),
316+
json={
317+
'id': 30,
318+
'status': 'new',
319+
'kind': 'social_network_vk',
320+
'name': 'updated website',
321+
'site_url': 'http://vk.com/updated',
322+
'verification_code': '074a583c47',
323+
'creation_date': '2025-08-28T12:54:24',
324+
'is_old': False,
325+
'account_id': '',
326+
'validation_passed': False,
327+
'is_lite': False,
328+
},
329+
status=200
330+
)
331+
332+
result = self.client.WebsitesManageV2.update(
333+
30,
334+
name='updated website',
335+
url='http://vk.com/updated',
336+
)
337+
338+
self.assertIn('id', result)
339+
self.assertIn('name', result)
340+
self.assertIn('site_url', result)
341+
self.assertEqual(result['name'], 'updated website')
342+
self.assertEqual(result['site_url'], 'http://vk.com/updated')
343+
344+
def test_verify_website_request(self):
345+
with responses.RequestsMock() as resp:
346+
resp.add(
347+
resp.POST,
348+
self.prepare_url(WebsitesManageV2.VERIFY_URL, website_id=30),
349+
json={
350+
'success': 'Accepted',
351+
'message': 'Площадка прошла автоматическую проверку.'
352+
},
353+
status=202
354+
)
355+
356+
result = self.client.WebsitesManageV2.verify(30)
357+
358+
self.assertIn('success', result)
359+
self.assertIn('message', result)
360+
self.assertEqual(result['success'], 'Accepted')
361+
362+
def test_delete_website_request(self):
363+
with responses.RequestsMock() as resp:
364+
resp.add(
365+
resp.POST,
366+
self.prepare_url(WebsitesManageV2.DELETE_URL, website_id=30),
367+
json={},
368+
status=200
369+
)
370+
371+
result = self.client.WebsitesManageV2.delete(30)
372+
373+
self.assertEqual(result, {})
374+
375+
def test_get_websites_request(self):
376+
with responses.RequestsMock() as resp:
377+
resp.add(
378+
resp.GET,
379+
self.prepare_url(WebsitesManageV2.GET_URL, params={
380+
'limit': 10,
381+
'offset': 0
382+
}),
383+
match_querystring=True,
384+
json={
385+
'results': [{
386+
'id': 30,
387+
'status': 'new',
388+
'kind': 'social_network_vk',
389+
'name': 'test website',
390+
'site_url': 'http://vk.com/xui',
391+
'verification_code': '074a583c47',
392+
'creation_date': '2025-08-28T12:54:24',
393+
'is_old': False,
394+
'account_id': '',
395+
'validation_passed': False,
396+
'is_lite': False,
397+
}],
398+
'_meta': {
399+
'limit': 10,
400+
'offset': 0,
401+
'count': 1,
402+
}
403+
},
404+
status=200
405+
)
406+
407+
result = self.client.WebsitesManageV2.get(limit=10, offset=0)
408+
409+
self.assertIn('results', result)
410+
self.assertIn('_meta', result)
411+
self.assertEqual(len(result['results']), 1)
412+
self.assertEqual(result['_meta']['count'], 1)
413+
414+
def test_get_website_request_with_id(self):
415+
with responses.RequestsMock() as resp:
416+
resp.add(
417+
resp.GET,
418+
self.prepare_url(WebsitesManageV2.GET_ONE_URL, website_id=30),
419+
json={
420+
'id': 30,
421+
'status': 'new',
422+
'kind': 'social_network_vk',
423+
'name': 'test website',
424+
'site_url': 'http://vk.com/xui',
425+
'verification_code': '074a583c47',
426+
'creation_date': '2025-08-28T12:54:24',
427+
'is_old': False,
428+
'account_id': '',
429+
'validation_passed': False,
430+
'is_lite': False,
431+
},
432+
status=200
433+
)
434+
435+
result = self.client.WebsitesManageV2.getOne(30)
436+
437+
self.assertIn('id', result)
438+
self.assertIn('name', result)
439+
self.assertIn('status', result)
440+
self.assertIn('kind', result)
441+
self.assertIn('verification_code', result)
442+
self.assertIn('site_url', result)
443+
self.assertIn('creation_date', result)
444+
self.assertIn('is_old', result)
445+
self.assertIn('account_id', result)
446+
self.assertIn('validation_passed', result)
447+
self.assertIn('is_lite', result)
448+
449+
267450
if __name__ == '__main__':
268451
unittest.main()

0 commit comments

Comments
 (0)