How to use register_realms method in selenium-respectful

Best Python code snippet using selenium-respectful_python

realms.py

Source:realms.py Github

copy

Full Screen

...35 """36 sig_support_changed.connect(RealmBaseModel.cache_delete_most_voted_objects)37 signals.post_save.connect(ReferenceRealm.build_sitetree, sender=Reference)38 signals.post_delete.connect(ReferenceRealm.build_sitetree, sender=Reference)39def register_realms(*classes):40 """Регистрирует области (сущности), которые должны быть доступны на сайте.41 :param classes:42 :return:43 """44 for cls in classes:45 REALMS_REGISTRY[cls.get_names()[0]] = cls46 cls.init()47def get_realms_models():48 """Возвращает список моделей всех областей сайта.49 :rtype: list50 """51 return [r.model for r in get_realms().values()]52def get_realms():53 """Возвращает словарь зарегистрированных областей сайта,54 индексированный именами областей.55 :return:56 """57 return REALMS_REGISTRY58def get_realm(name):59 """Вернёт объет области по её имени, либо None.60 :param str name:61 :return:62 """63 realms = get_realms()64 realm = None65 try:66 realm = realms[name]67 except KeyError:68 pass69 return realm70def get_sitemaps():71 """Возвращает словарь с sitemap-директивами для поисковых систем.72 :return:73 """74 sitemaps = {}75 for realm in get_realms().values():76 if realm.sitemap_enabled:77 sitemaps[realm.name_plural] = realm.get_sitemap()78 return sitemaps79def get_realms_urls():80 """Возвращает url-шаблоны всех зарегистрированных областей сайта.81 :return:82 """83 url_patterns = []84 for realm in get_realms().values():85 url_patterns += realm.get_urls()86 sitemaps = get_sitemaps()87 if sitemaps:88 url_patterns += [89 url(r'^sitemap\.xml$', sitemap, {'sitemaps': sitemaps})]90 return url_patterns91def get_sitetree_root_item(children=None):92 """Возвращает корневой элемент динамического древа сайта.93 :param tuple|generator children: Дочерние динамические элементы.94 """95 return item(96 'Про Python', '/', alias='topmenu', url_as_pattern=False,97 description='Сайт про Питон. Различные материалы по языку программирования Python: '98 'книги, видео, справочник, сообщества, события, обсуждения и многое другое.',99 children=children)100def build_sitetree():101 """Строит древо сайта, исходя из доступных областей сайта.102 :return:103 """104 # Потакаем поведению Django 1.7 при загрузке приложений.105 from sitetree.sitetreeapp import register_dynamic_trees, compose_dynamic_tree106 register_dynamic_trees(107 compose_dynamic_tree((108 tree('main', 'Основное дерево', (109 get_sitetree_root_item((realm.get_sitetree_items() for realm in get_realms().values())),110 item('Вход', 'login', access_guest=True, in_menu=False, in_breadcrumbs=False),111 item('', '/', alias='personal', url_as_pattern=False, access_loggedin=True, in_menu=False,112 in_sitetree=False, children=(113 item('Профиль', 'users:details request.user.id', access_loggedin=True, in_breadcrumbs=True,114 in_sitetree=False),115 item('Настройки', 'users:edit request.user.id', access_loggedin=True, in_breadcrumbs=True,116 in_sitetree=False),117 item('Выход', 'logout', access_loggedin=True, in_breadcrumbs=False, in_sitetree=False),118 )),119 )),120 tree('about', 'О проекте', (121 item('Что такое Python', '/promo/',122 description='Краткие сведения о возможностях и областях применения языка программирования Python.',123 url_as_pattern=False),124 item('О проекте', '/about/',125 description='Информация о проекте. О том, как, кем и для чего разрабатывается данный сайт.',126 url_as_pattern=False),127 item('Карта сайта', '/sitemap/', description='Список разделов на сайте оформленный в виде карты сайта.',128 url_as_pattern=False),129 item('Поиск по сайту', '/search/site/',130 description='Глобальный поиск по материалам, расположенным на сайте.',131 url_as_pattern=False),132 item('Результаты поиска «{{ search_term }}»', '/search/', url_as_pattern=False, in_menu=False,133 in_sitetree=False),134 ))135 )),136 reset_cache=True137 )138 ReferenceRealm.build_sitetree()139class BookRealm(RealmBase):140 """141 Область с книгами.142 """143 txt_form_add = 'Добавить книгу'144 txt_form_edit = 'Изменить книгу'145 view_listing_description = 'Книги по программированию вообще и на языке Python в частности.'146 view_listing_keywords = 'книги по питону, литература по python'147 model = Book148 form = BookForm149 icon = 'book'150class VideoRealm(RealmBase):151 """152 Область с видео.153 """154 txt_form_add = 'Добавить видео'155 txt_form_edit = 'Изменить видео'156 view_listing_description = 'Видео-записи лекций, курсов, докладов, связанные с языком программирования Python.'157 view_listing_keywords = 'видео по питону, доклады по python'158 model = Video159 form = VideoForm160 icon = 'film'161class EventRealm(RealmBase):162 """163 Область с событиями.164 """165 view_listing_description = 'События, которые могут заинтересовать питонистов: встречи, конференции, спринты, и пр.'166 view_listing_keywords = 'конференции по питону, встречи сообществ python'167 txt_form_add = 'Добавить событие'168 txt_form_edit = 'Изменить событие'169 model = Event170 form = EventForm171 icon = 'calendar'172class VacancyRealm(RealmBase):173 """174 Область с вакансиями.175 """176 allowed_views = ('listing',)177 name_plural = 'vacancies'178 show_on_main = False179 view_listing_description = 'Список вакансий, так или иначе связанных с языком программирования Python.'180 view_listing_keywords = 'вакансии python, работа питон'181 view_listing_base_class = VacancyListingView182 model = Vacancy183 icon = 'briefcase'184 sitemap_enabled = False185class ReferenceRealm(RealmBase):186 """187 Область со справочниками.188 """189 allowed_views = ('listing', 'details', 'add', 'edit')190 syndication_enabled = False191 txt_form_add = 'Дополнить справочник'192 txt_form_edit = 'Редактировать статью'193 view_listing_description = 'Справочные и обучающие материалы по языку программирования Python.'194 view_listing_keywords = 'справочник питон, руководство python'195 view_listing_base_class = ReferenceListingView196 view_details_base_class = ReferenceDetailsView197 model = Reference198 form = ReferenceForm199 icon = 'search'200 @classmethod201 def build_sitetree(cls, **kwargs):202 """Строит динамическое дерево справочника под именем `references`."""203 root_id = object()204 root_item = get_sitetree_root_item()205 temp_ref_items = {root_id: root_item}206 ref_items = list(cls.model.get_actual().select_related('parent').only(207 'id', 'parent_id', 'parent__title', 'slug', 'status'208 ).order_by('parent_id', 'title', 'id'))209 def get_tree_item(ref_item):210 item_id = getattr(ref_item, 'id', root_id)211 tree_item = temp_ref_items.get(item_id)212 if not tree_item:213 tree_item = item(ref_item.title, ref_item.get_absolute_url(), url_as_pattern=False)214 temp_ref_items[item_id] = tree_item215 return tree_item216 for ref_item in ref_items:217 parent = get_tree_item(ref_item.parent)218 child = get_tree_item(ref_item)219 child.parent = parent220 parent.dynamic_children.append(child)221 from sitetree.sitetreeapp import register_dynamic_trees, compose_dynamic_tree222 register_dynamic_trees(compose_dynamic_tree([tree('references', items=[root_item])]), reset_cache=True)223class ArticleRealm(RealmBase):224 """225 Область со статьями.226 """227 txt_form_add = 'Добавить статью'228 txt_form_edit = 'Редактировать статью'229 view_listing_description = 'Статьи и заметки, связанные с программированием Python и не только.'230 view_listing_keywords = 'статьи о питоне, материалы по python'231 model = Article232 form = ArticleForm233 icon = 'file-o'234class PlaceRealm(RealmBase):235 """236 Область с географическими объектами (местами).237 """238 view_listing_description = 'Места, так или иначе связанные с языком программирования Python.'239 view_listing_keywords = 'python в городе, где программируют на питоне'240 view_listing_base_class = PlaceListingView241 view_details_base_class = PlaceDetailsView242 model = Place243 form = VideoForm244 icon = 'globe'245 sitemap_changefreq = 'weekly'246 allowed_views = ('listing', 'details')247 show_on_main = False248 show_on_top = False249class DiscussionRealm(RealmBase):250 """251 Область обсуждений.252 """253 txt_form_add = 'Создать обсуждение'254 txt_form_edit = 'Редактировать обсуждение'255 view_listing_description = 'Обсуждения вопросов, связанных с программированием на Питоне.'256 view_listing_keywords = 'вопросы по питону, обсуждения python'257 model = Discussion258 form = DiscussionForm259 icon = 'comments-o'260 show_on_top = False261class UserRealm(RealmBase):262 """263 Область с пользователями сайта.264 """265 txt_form_edit = 'Изменить настройки'266 view_listing_description = 'Список пользователей сайта.'267 view_listing_keywords = 'питонисты, разработчики python, пользователи сайта'268 view_details_base_class = UserDetailsView269 view_edit_base_class = UserEditView270 model = User271 form = UserForm272 icon = 'users'273 sitemap_date_field = 'date_joined'274 sitemap_changefreq = 'weekly'275 allowed_views = ('listing', 'details', 'edit')276 show_on_main = False277 show_on_top = False278 syndication_enabled = False279 @classmethod280 def get_sitetree_details_item(cls):281 return item('{{ user.get_display_name }}', 'users:details user.id', in_menu=False, in_sitetree=False)282class CategoryRealm(RealmBase):283 """284 Область с категориями.285 """286 view_listing_description = 'Карта категорий материалов по языку программирования Python доступных на сайте.'287 view_listing_keywords = 'материалы по питону, python по категориям'288 model = get_category_model()289 icon = 'tag'290 name = 'category'291 name_plural = 'categories'292 allowed_views = ('listing', 'details')293 ready_for_digest = False294 sitemap_enabled = False295 show_on_main = False296 show_on_top = False297 view_listing_title = 'Путеводитель'298 view_listing_base_class = CategoryListingView299 view_details_base_class = CategoryListingView300 SYNDICATION_NAMESPACE = 'category_feeds'301 @classmethod302 def get_sitetree_details_item(cls):303 return item(304 'Категория «{{ category.parent.title }} — {{ category.title }}»', 'categories:details category.id',305 in_menu=False, in_sitetree=False)306 @classmethod307 def init(cls):308 # Включаем прослушивание сигналов, необходимое для функционировая области.309 tie_model = get_tie_model()310 # url-синдикации будут обновлены в случае добавления/удаления связи сущности с категорией.311 signals.post_save.connect(cls.update_syndication_urls, sender=tie_model)312 signals.post_delete.connect(cls.update_syndication_urls, sender=tie_model)313 @classmethod314 def get_urls(cls):315 urls = super().get_urls()316 urls += CategoryRealm.get_syndication_urls()317 return urls318 @classmethod319 def get_syndication_url(cls):320 return 'feed/'321 @classmethod322 def update_syndication_urls(cls, **kwargs):323 """Обновляет url-шаблоны синдикации, заменяя старые новыми."""324 target_namespace = cls.SYNDICATION_NAMESPACE325 linked_category_id_str = 'category_%s' % kwargs['instance'].category_id326 pattern_idx = -1327 resolver = get_resolver(None)328 urlpatterns = getattr(resolver.urlconf_module, 'urlpatterns', resolver.urlconf_module)329 for idx, pattern in enumerate(urlpatterns):330 if getattr(pattern, 'namespace', '') == target_namespace:331 pattern_idx = idx332 if linked_category_id_str in pattern.reverse_dict.keys():333 # Категория была известна и ранее, перепривязка URL не требуется.334 return335 break336 if pattern_idx > -1:337 del urlpatterns[pattern_idx]338 urlpatterns += cls.get_syndication_urls()339 @classmethod340 def get_syndication_urls(cls):341 """Возвращает url-шаблоны с привязанными сгенерированными представлениями342 для потоков синдикации (RSS) с перечислением новых материалов в категориях.343 :return:344 """345 feeds = []346 tie_model = get_tie_model()347 categories = tie_model.get_linked_objects(by_category=True)348 def get_in_category(category_id):349 """Возвращает объекты из разных областей в указанной категории."""350 linked = tie_model.get_linked_objects(filter_kwargs={'category_id': category_id}, id_only=True)351 result = []352 for model, ids in linked.items():353 result.extend(model.get_actual().filter(id__in=ids)[:SYNDICATION_ITEMS_LIMIT])354 result = sorted(result, key=attrgetter('time_published'), reverse=True)355 return result[:SYNDICATION_ITEMS_LIMIT]356 for category in categories.keys():357 title = category.title358 category_id = category.id359 feed = RealmBase._get_syndication_feed(360 title=title,361 description='Материалы в категории «%s». %s' % (title, category.note),362 func_link=lambda self: reverse(CategoryRealm.get_details_urlname(), args=[self.category_id]),363 func_items=lambda self: get_in_category(self.category_id),364 cls_name='Category%s' % category_id365 )366 feed.category_id = category_id367 feeds.append(368 url(r'^%s/%s/$' % (category_id, SYNDICATION_URL_MARKER), feed, name='category_%s' % category_id))369 _, realm_name_plural = CategoryRealm.get_names()370 return [url(r'^%s/' % realm_name_plural, (feeds, realm_name_plural, cls.SYNDICATION_NAMESPACE))]371class CommunityRealm(RealmBase):372 """373 Область с сообществами.374 """375 txt_form_add = 'Добавить сообщество'376 txt_form_edit = 'Редактировать сообщество'377 view_listing_description = 'Сообщества людей интересующихся и занимающихся программированием на Питоне.'378 view_listing_keywords = 'сообщества питонистов, программисты python'379 name = 'community'380 name_plural = 'communities'381 model = Community382 form = CommunityForm383 icon = 'building-o'384 show_on_main = False385 show_on_top = False386class VersionRealm(RealmBase):387 """388 Область с версиями.389 """390 txt_form_add = 'Добавить версию'391 txt_form_edit = 'Редактировать версию'392 view_listing_description = 'Вышедшие и будущие выпуски Python.'393 view_listing_keywords = 'версии python, выпуски Питона'394 allowed_views = ('listing', 'details', 'add', 'edit')395 view_details_base_class = VersionDetailsView396 name = 'version'397 name_plural = 'versions'398 model = Version399 form = VersionForm400 icon = 'code-fork'401 syndication_enabled = False402 show_on_top = False403class PepRealm(RealmBase):404 """405 Область с предложениями по улучшению.406 """407 view_listing_description = 'Предложения по улучшению Питона (PEP).'408 view_listing_keywords = 'python pep, преложения по улучшению, пепы, пеп'409 allowed_views = ('listing', 'details')410 name = 'pep'411 name_plural = 'peps'412 model = PEP413 icon = 'bell'414 show_on_top = False415class PersonRealm(RealmBase):416 """Область персон."""417 view_listing_description = 'Персоны, тем или иным образом связанные с языком Python.'418 view_listing_keywords = 'персоны python, питонисты, разработчики python'419 allowed_views = ('listing', 'details')420 view_details_base_class = PersonDetailsView421 name = 'person'422 name_plural = 'persons'423 model = Person424 icon = 'user'425 show_on_main = False426 show_on_top = False427 syndication_enabled = False428 ready_for_digest = False429register_realms(430 CategoryRealm,431 ArticleRealm,432 ReferenceRealm,433 VideoRealm,434 BookRealm,435 VacancyRealm,436 EventRealm,437 PlaceRealm,438 DiscussionRealm,439 CommunityRealm,440 VersionRealm,441 PepRealm,442 PersonRealm,443 UserRealm,...

Full Screen

Full Screen

respectful_requester.py

Source:respectful_requester.py Github

copy

Full Screen

...64 redis_key, {"max_requests": max_requests, "timespan": timespan}65 )66 self.redis.sadd("%s:REALMS" % self.redis_prefix, realm)67 return True68 def register_realms(self, realm_tuples):69 for realm_tuple in realm_tuples:70 self.register_realm(*realm_tuple)71 return True72 def update_realm(self, realm, **kwargs):73 redis_key = self._realm_redis_key(realm)74 updatable_keys = ["max_requests", "timespan"]75 for updatable_key in updatable_keys:76 if updatable_key in kwargs and type(kwargs[updatable_key]) == int:77 self.redis.hset(redis_key, updatable_key, kwargs[updatable_key])78 return True79 def unregister_realm(self, realm):80 self.redis.delete(self._realm_redis_key(realm))81 self.redis.srem("%s:REALMS" % self.redis_prefix, realm)82 request_keys = self.redis.keys("%s:REQUEST:%s:*" % (self.redis_prefix, realm))83 [self.redis.delete(k) for k in request_keys]84 return True85 def unregister_realms(self, realms):86 for realm in realms:87 self.unregister_realm(realm)88 return True89 def realm_max_requests(self, realm):90 realm_info = self._fetch_realm_info(realm)91 return int(realm_info["max_requests".encode("utf-8")].decode("utf-8"))92 def realm_timespan(self, realm):93 realm_info = self._fetch_realm_info(realm)94 return int(realm_info["timespan".encode("utf-8")].decode("utf-8"))95 @classmethod96 def configure(cls, **kwargs):97 if "redis" in kwargs:98 if type(kwargs["redis"]) != dict:99 raise RequestsRespectfulConfigError("'redis' key must be a dict")...

Full Screen

Full Screen

Automation Testing Tutorials

Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.

LambdaTest Learning Hubs:

YouTube

You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.

Run selenium-respectful automation tests on LambdaTest cloud grid

Perform automation testing on 3000+ real desktop and mobile devices online.

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful