Changeset 279:bde1c620c072


Ignore:
Timestamp:
30.10.2010 10:03:50 (19 months ago)
Author:
alafin <alafin@…>
Branch:
default
Message:

fix #71 Permissions of feeds

Location:
djangobb/djangobb_forum
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • djangobb/djangobb_forum/feeds.py

    r211 r279  
    1 from django.contrib.syndication.feeds import Feed, FeedDoesNotExist 
     1from django.contrib.syndication.views import Feed, FeedDoesNotExist 
    22from django.core.exceptions import ObjectDoesNotExist 
    33from django.utils.feedgenerator import Atom1Feed 
    44from django.core.urlresolvers import reverse 
    55from django.utils.translation import ugettext_lazy as _ 
     6from django.contrib.auth.models import User 
     7from django.db.models import Q 
     8from django.http import Http404 
    69 
    710from djangobb_forum.models import Post, Topic, Forum, Category 
     
    2629    description_template = 'forum/feeds/posts_description.html' 
    2730 
    28     def items(self): 
    29         return Post.objects.order_by('-created')[:15] 
     31    def get_object(self, request): 
     32        user_groups = request.user.groups.all() 
     33        if request.user.is_anonymous(): 
     34            user_groups = [] 
     35        allow_forums = Forum.objects.filter( 
     36                Q(category__groups__in=user_groups) | \ 
     37                Q(category__groups__isnull=True)) 
     38        return allow_forums 
     39 
     40    def items(self, allow_forums): 
     41        return Post.objects.filter(topic__forum__in=allow_forums).order_by('-created')[:15] 
    3042 
    3143 
     
    3648    description_template = 'forum/feeds/topics_description.html' 
    3749 
    38     def items(self): 
    39         return Topic.objects.order_by('-created')[:15] 
     50    def get_object(self, request): 
     51        user_groups = request.user.groups.all() 
     52        if request.user.is_anonymous(): 
     53            user_groups = [] 
     54        allow_forums = Forum.objects.filter( 
     55                Q(category__groups__in=user_groups) | \ 
     56                Q(category__groups__isnull=True)) 
     57        return allow_forums 
     58 
     59    def items(self, allow_forums): 
     60        return Topic.objects.filter(forum__in=allow_forums).order_by('-created')[:15] 
    4061 
    4162 
     
    4465    description_template = 'forum/feeds/posts_description.html' 
    4566     
    46     def get_object(self, topics): 
     67    def get_object(self, request, topics): 
    4768        if len(topics) != 1: 
    4869            raise ObjectDoesNotExist 
    49         return Topic.objects.get(id=topics[0]) 
     70        topic = Topic.objects.get(id=topics[0]) 
     71        if not topic.forum.category.has_access(request.user): 
     72            raise Http404 
     73        return topic 
    5074 
    5175    def title(self, obj): 
     
    6892    description_template = 'forum/feeds/posts_description.html' 
    6993 
    70     def get_object(self, forums): 
     94    def get_object(self, request, forums): 
    7195        if len(forums) != 1: 
    7296            raise ObjectDoesNotExist 
    73         return Forum.objects.get(id=forums[0]) 
     97        forum = Forum.objects.get(id=forums[0]) 
     98        if not forum.category.has_access(request.user): 
     99            raise Http404 
     100        return forum 
    74101 
    75102    def title(self, obj): 
     
    92119    description_template = 'forum/feeds/posts_description.html' 
    93120     
    94     def get_object(self, categories): 
     121    def get_object(self, request, categories): 
    95122        if len(categories) != 1: 
    96123            raise ObjectDoesNotExist 
    97         return Category.objects.get(id=categories[0]) 
     124        category = Category.objects.get(id=categories[0]) 
     125        if not category.has_access(request.user): 
     126            raise Http404 
     127        return category 
    98128 
    99129    def title(self, obj): 
  • djangobb/djangobb_forum/forms.py

    r249 r279  
    1010from django.utils.translation import ugettext as _ 
    1111 
    12 from djangobb_forum.models import Topic, Post, Profile, Reputation, Report, PrivateMessage,\ 
     12from djangobb_forum.models import Topic, Post, Profile, Reputation, Report, \ 
    1313    Forum, Attachment, TZ_CHOICES, PRIVACY_CHOICES 
    1414from djangobb_forum.markups import bbmarkup 
     
    361361            report.save() 
    362362        return report 
    363  
    364  
    365 class CreatePMForm(forms.ModelForm): 
    366     recipient = forms.CharField(label=_('Recipient')) 
    367      
    368     class Meta: 
    369         model = PrivateMessage 
    370         fields = ['subject', 'body'] 
    371          
    372     def __init__(self, *args, **kwargs): 
    373         self.user = kwargs.pop('user', None) 
    374         super(CreatePMForm, self).__init__(*args, **kwargs) 
    375         self.fields.keyOrder = ['recipient', 'subject', 'body'] 
    376         self.fields['subject'].widget = widget=forms.TextInput(attrs={'size':'115'}) 
    377         self.fields['body'].widget = forms.Textarea(attrs={'class':'bbcode'}) 
    378          
    379     def clean_recipient(self): 
    380         name = self.cleaned_data['recipient'] 
    381         try: 
    382             user = User.objects.get(username=name) 
    383         except User.DoesNotExist: 
    384             raise forms.ValidationError(_('User with login %s does not exist') % name) 
    385         else: 
    386             return user 
    387  
    388     def save(self): 
    389         pm = PrivateMessage(src_user=self.user, dst_user=self.cleaned_data['recipient']) 
    390         pm = forms.save_instance(self, pm) 
    391         return pm 
  • djangobb/djangobb_forum/models.py

    r251 r279  
    331331        return u'%s %s' % (self.reported_by ,self.zapped) 
    332332 
    333  
    334 class PrivateMessage(models.Model): 
    335     dst_user = models.ForeignKey(User, verbose_name=_('Recipient'), related_name='dst_users') 
    336     src_user = models.ForeignKey(User, verbose_name=_('Author'), related_name='src_users') 
    337     read = models.BooleanField(_('Read'), blank=True, default=False) 
    338     created = models.DateTimeField(_('Created'), auto_now_add=True) 
    339     markup = models.CharField(_('Markup'), max_length=15, default=forum_settings.DEFAULT_MARKUP, choices=MARKUP_CHOICES) 
    340     subject = models.CharField(_('Subject'), max_length=255) 
    341     body = models.TextField(_('Message')) 
    342     body_html = models.TextField(_('HTML version')) 
    343     body_text = models.TextField(_('Text version')) 
    344  
    345     class Meta: 
    346         ordering = ['-created'] 
    347         verbose_name = _('Private message') 
    348         verbose_name_plural = _('Private messages') 
    349  
    350     def __unicode__(self): 
    351         return self.subject 
    352  
    353     def save(self, *args, **kwargs): 
    354         if self.markup == 'bbcode': 
    355             self.body_html = bbmarkup.bbcode(self.body) 
    356         elif self.markup == 'markdown': 
    357             self.body_html = unicode(Markdown(self.body, safe_mode='escape')) 
    358             #self.body_html = markdown(self.body, 'safe') 
    359         else: 
    360             raise Exception('Invalid markup property: %s' % self.markup) 
    361         self.body_html = urlize(self.body_html) 
    362         if forum_settings.SMILES_SUPPORT: 
    363             self.body_html = smiles(self.body_html) 
    364         super(PrivateMessage, self).save(*args, **kwargs) 
    365  
    366     @models.permalink 
    367     def get_absolute_url(self): 
    368         return  ('djangobb:forum_show_pm', [self.id]) 
    369  
    370     # TODO: summary and part of the save method is the same as in the Post model 
    371     # move to common functions 
    372     def summary(self): 
    373         LIMIT = 50 
    374         tail = len(self.body) > LIMIT and '...' or ''  
    375         return self.body[:LIMIT] + tail 
    376  
    377  
    378333class Ban(models.Model): 
    379334    user = models.OneToOneField(User, verbose_name=_('Banned user'), related_name='ban_users') 
  • djangobb/djangobb_forum/signals.py

    r218 r279  
    33from django.db.models.signals import post_save, pre_save, post_delete 
    44 
    5 from djangobb_forum.subscription import notify_topic_subscribers, notify_pm_recipients 
    6 from djangobb_forum.models import Topic, Post, PrivateMessage 
     5from djangobb_forum.subscription import notify_topic_subscribers 
     6from djangobb_forum.models import Topic, Post 
    77 
    88 
     
    2323 
    2424 
    25 def pm_saved(instance, **kwargs): 
    26     notify_pm_recipients(instance)  
    27  
    28  
    2925def topic_saved(instance, **kwargs): 
    3026    created = kwargs.get('created') 
     
    3935 
    4036post_save.connect(post_saved, sender=Post) 
    41 post_save.connect(pm_saved, sender=PrivateMessage) 
    4237post_save.connect(topic_saved, sender=Topic) 
  • djangobb/djangobb_forum/subscription.py

    r242 r279  
    1414See topic: %(post_url)s 
    1515Unsubscribe %(unsubscribe_url)s""") 
    16  
    17 PM_RECIPIENT_TEXT_TEMPLATE = (u"""User %(username)s have sent your the new private message. 
    18 --- 
    19 %(message)s 
    20 --- 
    21 See message online: %(pm_url)s""") 
    2216 
    2317 
     
    6054                #html_content = html_version(post) 
    6155                send_mail([to_email], subject, text_content) 
    62  
    63  
    64 def notify_pm_recipients(pm): 
    65     if not pm.read: 
    66         from djangobb_forum.models import PrivateMessage  
    67         subject = (u'There are new messages') 
    68         to_email = pm.dst_user.email 
    69         text_content = PM_RECIPIENT_TEXT_TEMPLATE % { 
    70             'username': pm.src_user.username, 
    71             'message': pm.body_text, 
    72             'pm_url': absolute_url(pm.get_absolute_url()), 
    73          } 
    74         send_mail([to_email], subject, text_content) 
  • djangobb/djangobb_forum/templates/forum/base.html

    r211 r279  
    1616        <link rel="stylesheet" type="text/css" href="{{ MEDIA_URL }}forum/js/markitup/sets/bbcode/style.css" /> 
    1717 
    18         <link rel="alternate" type="application/atom+xml" href="{% url djangobb:forum_feed "posts" %}" title="{% trans "Latest posts on forum" %}" /> 
    19         <link rel="alternate" type="application/atom+xml" href="{% url djangobb:forum_feed "topics" %}" title="{% trans "Latest topics on forum" %}" /> 
     18        <link rel="alternate" type="application/atom+xml" href="{% url djangobb:forum_posts_feed %}" title="{% trans "Latest posts on forum" %}" /> 
     19        <link rel="alternate" type="application/atom+xml" href="{% url djangobb:forum_topics_feed %}" title="{% trans "Latest topics on forum" %}" /> 
    2020 
    2121        <link rel="shortcut icon" href="{{ MEDIA_URL }}forum/favicon.png" type="image/png" /> 
  • djangobb/djangobb_forum/templates/forum/delete_posts.html

    r272 r279  
    88                <p class="pagelink conl">{% pagination %}</p> 
    99                                <ul><li><a href="{% url djangobb:index %}">{% trans "Root" %} </a></li><li>&raquo; {% link topic.forum %} </li><li>&raquo; {{ topic }}  
    10                                 <a href="{% url djangobb:forum_feed "topic" %}{{ topic.id }}"><img src="{{ MEDIA_URL }}/forum/img/feed-icon-small.png" alt="[RSS Feed]" title="[RSS Feed]" style="vertical-align:middle;" /></a> 
     10                                <a href="{% url djangobb:forum_topic_feed %}{{ topic.id }}"><img src="{{ MEDIA_URL }}/forum/img/feed-icon-small.png" alt="[RSS Feed]" title="[RSS Feed]" style="vertical-align:middle;" /></a> 
    1111                                </li></ul> 
    1212                <div class="clearer"></div> 
  • djangobb/djangobb_forum/templates/forum/forum.html

    r211 r279  
    1717<div id="vf" class="blocktable"> 
    1818        <h2> 
    19                 <a href="{% url djangobb:forum_feed "forum" %}{{ forum.id }}"><img src="{{ MEDIA_URL }}/forum/img/feed-icon-small.png"  alt="[RSS Feed]" title="[RSS Feed]" class="rss" /></a> 
     19                <a href="{% url djangobb:forum_forum_feed forum.id %}"><img src="{{ MEDIA_URL }}/forum/img/feed-icon-small.png"  alt="[RSS Feed]" title="[RSS Feed]" class="rss" /></a> 
    2020                <b><span>{{ forum.name }}</span></b> 
    2121        </h2> 
  • djangobb/djangobb_forum/templates/forum/forum_row.html

    r278 r279  
    1414                        </div> 
    1515                        <div class="tclcon"> 
    16                                 <h3>{% link forum %} <a href="{% url djangobb:forum_feed "forum" %}{{ forum.id }}/"><img src="{{ MEDIA_URL }}forum/img/feed-icon-small.png"  alt="[RSS Feed]" title="[RSS Feed]" class="rss" /></a></h3> 
     16                                <h3>{% link forum %} <a href="{% url djangobb:forum_forum_feed forum.id %}"><img src="{{ MEDIA_URL }}forum/img/feed-icon-small.png"  alt="[RSS Feed]" title="[RSS Feed]" class="rss" /></a></h3> 
    1717                                {{ forum.description|safe }}                             
    1818                                <p> 
  • djangobb/djangobb_forum/templates/forum/topic.html

    r272 r279  
    1414                        <li> 
    1515                        <a href="{% url djangobb:index %}">{% trans "Root" %} </a></li><li>&raquo; {% link topic.forum %} </li><li>&raquo; {{ topic.name }} 
    16                         <a href="{% url djangobb:forum_feed "topic" %}{{ topic.id }}/"><img src="{{ MEDIA_URL }}forum/img/feed-icon-small.png" alt="[RSS Feed]" title="[RSS Feed]" class="breadcrumb_rss" /></a> 
     16                        <a href="{% url djangobb:forum_topic_feed topic.id %}"><img src="{{ MEDIA_URL }}forum/img/feed-icon-small.png" alt="[RSS Feed]" title="[RSS Feed]" class="breadcrumb_rss" /></a> 
    1717                        </li> 
    1818                </ul> 
     
    134134                <p class="postlink conr"><a href="{% url djangobb:add_post topic.id %}">{% trans "Reply" %}</a></p> 
    135135                                <ul><li><a href="{% url djangobb:index %}">{% trans "Root" %} </a></li><li>&raquo; {% link topic.forum %} </li><li>&raquo; {{ topic }}  
    136                                 <a href="{% url djangobb:forum_feed "topic" %}{{ topic.id }}"><img src="{{ MEDIA_URL }}/forum/img/feed-icon-small.png"  alt="[RSS Feed]" title="[RSS Feed]" class="breadcrumb_rss" /></a> 
     136                                <a href="{% url djangobb:forum_topic_feed topic.id %}"><img src="{{ MEDIA_URL }}/forum/img/feed-icon-small.png"  alt="[RSS Feed]" title="[RSS Feed]" class="breadcrumb_rss" /></a> 
    137137                                </li></ul> 
    138138                {% if user.is_authenticated %} 
  • djangobb/djangobb_forum/urls.py

    r260 r279  
    55from djangobb_forum.feeds import LastPosts, LastTopics, LastPostsOnForum,\ 
    66     LastPostsOnCategory, LastPostsOnTopic 
    7  
    8 feeds = { 
    9     'posts': LastPosts, 
    10     'topics': LastTopics, 
    11     'topic': LastPostsOnTopic, 
    12     'forum': LastPostsOnForum, 
    13     'category': LastPostsOnCategory, 
    14 } 
     7      
    158 
    169urlpatterns = patterns('', 
     
    4841    url('^subscription/topic/(?P<topic_id>\d+)/delete/$', forum_views.delete_subscription, name='forum_delete_subscription'), 
    4942    url('^subscription/topic/(?P<topic_id>\d+)/add/$', forum_views.add_subscription, name='forum_add_subscription'), 
     43     
    5044    # Feeds 
    51     url(r'^feeds/(?P<url>.*)/$', 'django.contrib.syndication.views.feed', 
    52         {'feed_dict': feeds}, name='forum_feed'), 
     45    url(r'^feeds/posts/$', LastPosts(), name='forum_posts_feed'), 
     46    url(r'^feeds/topics/$', LastTopics(), name='forum_topics_feed'), 
     47    url(r'^feeds/topic/(?P<topics>\d+)/$', LastPostsOnTopic(), name='forum_topic_feed'), 
     48    url(r'^feeds/forum/(?P<forums>\d+)/$', LastPostsOnForum(), name='forum_forum_feed'), 
     49    url(r'^feeds/category/(?P<categories>\d+)/$', LastPostsOnCategory(), name='forum_category_feed'), 
    5350) 
    54  
    5551 
    5652### EXTENSIONS ### 
  • djangobb/djangobb_forum/views.py

    r264 r279  
    2020from djangobb_forum.util import render_to, paged, build_form, paginate, set_language 
    2121from djangobb_forum.models import Category, Forum, Topic, Post, Profile, Reputation,\ 
    22     Report, PrivateMessage, Attachment, PostTracking 
     22    Report, Attachment, PostTracking 
    2323from djangobb_forum.forms import AddPostForm, EditPostForm, UserSearchForm,\ 
    2424    PostSearchForm, ReputationForm, MailToForm, EssentialsProfileForm,\ 
    2525    PersonalProfileForm, MessagingProfileForm, PersonalityProfileForm,\ 
    26     DisplayProfileForm, PrivacyProfileForm, ReportForm, UploadAvatarForm, CreatePMForm 
     26    DisplayProfileForm, PrivacyProfileForm, ReportForm, UploadAvatarForm 
    2727from djangobb_forum.markups import bbmarkup 
    2828from djangobb_forum.templatetags import forum_extras 
Note: See TracChangeset for help on using the changeset viewer.