def store_article_access(request, article, access_type, galley_type='view'): try: user_agent = parse_ua_string(request.META.get('HTTP_USER_AGENT', None)) except TypeError: user_agent = None ip = shared.get_ip_address(request) iso_country_code = get_iso_country_code(ip) country = iso_to_country_object(iso_country_code) counter_tracking_id = request.session.get('counter_tracking') identifier = counter_tracking_id if counter_tracking_id else ip if user_agent and not user_agent.is_bot: # check if the current IP has accessed this article recently. time_to_check = timezone.now() - timedelta(seconds=30) check = models.ArticleAccess.objects.filter( identifier=identifier, accessed__gte=time_to_check, type=access_type, galley_type=galley_type, ).count() if not check: new_access = models.ArticleAccess.objects.create( article=article, type=access_type, identifier=identifier, galley_type=galley_type, country=country, ) return new_access else: # get the most recent access attempt and reset its accessed to now. with transaction.atomic(): access = models.ArticleAccess.objects.select_for_update( # Avoid concurrent writes skip_locked=True, ).filter( identifier=identifier, accessed__gte=time_to_check, type=access_type, galley_type=galley_type, ).order_by('-accessed')[0] if access: access.accessed = timezone.now() access.save() return access else: return None else: return None
def add_entry(types, description, level, actor=None, request=None, target=None, is_email=False, to=None, message_id=None, subject=None): if actor is not None and callable(getattr(actor, "is_anonymous", None)): if actor.is_anonymous(): actor = None kwargs = { 'types': types, 'description': description, 'level': level, # if no actor is supplied, assume anonymous 'actor': actor if actor else None, 'ip_address': get_ip_address(request), 'target': target, 'is_email': is_email, 'to': to, 'message_id': message_id, 'subject': subject, } new_entry = LogEntry.objects.create(**kwargs).save() return new_entry
def contact(request): subject = request.GET.get('subject', '') contact_form = forms.ContactForm(subject=subject) if request.POST: contact_form = forms.ContactForm(request.POST) if contact_form.is_valid(): new_contact = contact_form.save(commit=False) new_contact.client_ip = shared.get_ip_address(request) new_contact.content_type = request.model_content_type new_contact.object_ic = request.site_type.pk new_contact.save() logic.send_contact_message(new_contact, request) messages.add_message(request, messages.SUCCESS, 'Your message has been sent.') return redirect(reverse('contact')) template = 'journal/contact.html' context = { 'contact_form': contact_form, 'contacts': core_models.Contacts.objects.filter( content_type=request.model_content_type, object_id=request.site_type.pk) } return render(request, template, context)
def store_article_access(request, article, access_type, galley_type='view'): user_agent = parse_ua_string(request.META.get('HTTP_USER_AGENT', None)) counter_tracking_id = request.session.get('counter_tracking') identifier = counter_tracking_id if counter_tracking_id else shared.get_ip_address( request) if user_agent and not user_agent.is_bot: # check if the current IP has accessed this article recently. time_to_check = timezone.now() - timedelta(seconds=30) check = models.ArticleAccess.objects.filter( identifier=identifier, accessed__gte=time_to_check, type=access_type, galley_type=galley_type).count() if not check: new_access = models.ArticleAccess.objects.create( article=article, type=access_type, identifier=identifier, galley_type=galley_type) return new_access else: # get the most recent access attempt and reset its accessed to now. access = models.ArticleAccess.objects.filter( identifier=identifier, accessed__gte=time_to_check, type=access_type, galley_type=galley_type).order_by('-accessed')[0] if access: access.accessed = timezone.now() access.save() return access else: return None else: return None
def add_entry(types, description, level, actor=None, request=None, target=None, is_email=False, to=None, message_id=None, subject=None): if actor is not None and callable(getattr(actor, "is_anonymous", None)): if actor.is_anonymous(): actor = None kwargs = { 'types': types, 'description': description, 'level': level, # if no actor is supplied, assume anonymous 'actor': actor if actor else None, 'ip_address': get_ip_address(request), 'target': target, 'is_email': is_email, 'to': to, 'message_id': message_id, 'subject': subject, } new_entry = LogEntry.objects.create(**kwargs).save() if request and request.journal: if request.journal.slack_logging_enabled: notify.notification( **{ 'slack_message': '[{0}] {1}'.format(kwargs['ip_address'], description), 'action': ['slack_admins'], 'request': request }) return new_entry
def add_book_access(self, request, access_type='download'): try: user_agent = parse_ua_string(request.META.get('HTTP_USER_AGENT', None)) except TypeError: user_agent = None ip = get_ip_address(request) iso_country_code = get_iso_country_code(ip) identifier = request.session.session_key try: country = core_models.Country.objects.get( code=iso_country_code, ) except core_models.Country.DoesNotExist: country = None if user_agent and not user_agent.is_bot: # check if the current IP has accessed this article recently. time_to_check = timezone.now() - timedelta(seconds=10) check = BookAccess.objects.filter( book=self.book, chapter=self, accessed__gte=time_to_check, type=access_type, identifier=identifier, ).count() if not check: BookAccess.objects.create( book=self.book, chapter=self, type=access_type, country=country, identifier=identifier, )
def get_ua_and_ip(request): user_agent = request.META.get('HTTP_USER_AGENT', None) ip_address = shared.get_ip_address(request) return user_agent, ip_address