Browse Source

- Changed way Misago handles hidden sessions
- Stub of Forum Options UserCP page

Ralfp 12 years ago
parent
commit
077231d00e

+ 4 - 3
misago/security/auth.py

@@ -108,11 +108,12 @@ def auth_admin(request, email, password):
     return user;
     return user;
 
 
 
 
-def sign_user_in(request, user, as_hidden=False):
+def sign_user_in(request, user):
     user.set_last_visit(
     user.set_last_visit(
                         request.session.get_ip(request),
                         request.session.get_ip(request),
                         request.META.get('HTTP_USER_AGENT', ''),
                         request.META.get('HTTP_USER_AGENT', ''),
-                        as_hidden
                         )
                         )
     user.save(force_update=True)
     user.save(force_update=True)
-    request.session.set_user(user)
+    request.session.set_user(user)
+    if request.settings['sessions_hidden']:
+        request.session.set_hidden(user.hide_activity > 0)

+ 16 - 12
misago/security/forms.py

@@ -4,23 +4,27 @@ from misago.forms import Form
 
 
 class SignInForm(Form):
 class SignInForm(Form):
     user_email = forms.EmailField(max_length=255, label=_("Your email"))
     user_email = forms.EmailField(max_length=255, label=_("Your email"))
-    user_password = forms.CharField(max_length=255, label=_("Your password"))
+    user_password = forms.CharField(widget=forms.PasswordInput, max_length=255, label=_("Your password"))
     user_remember_me = forms.BooleanField(label=_("Stay Signed In"), help_text=_("Sign me In automatically next time"), required=False)
     user_remember_me = forms.BooleanField(label=_("Stay Signed In"), help_text=_("Sign me In automatically next time"), required=False)
-    user_stay_hidden = forms.BooleanField(label=_("Sign In as Hidden"), help_text=_("Dont show me on any on-line lists"), required=False)
+    
+    layout = [
+              (
+               None,
+               (
+                ('user_email', {'attrs': {'placeholder': _("Enter your e-mail")}}),
+                ('user_password', {'has_value': False, 'placeholder': _("Enter your password")}),
+                )
+               ),
+              (
+               None,
+               ['user_remember_me'],
+               ),
+              ]
     
     
     def __init__(self, *args, **kwargs):
     def __init__(self, *args, **kwargs):
         show_remember_me = kwargs['show_remember_me']
         show_remember_me = kwargs['show_remember_me']
-        show_stay_hidden = kwargs['show_stay_hidden']
         del kwargs['show_remember_me']
         del kwargs['show_remember_me']
-        del kwargs['show_stay_hidden']
         
         
         super(SignInForm, self).__init__(*args, **kwargs)
         super(SignInForm, self).__init__(*args, **kwargs)
         if not show_remember_me:
         if not show_remember_me:
-            del self.fields['user_remember_me']
-        if not show_stay_hidden:
-            del self.fields['user_stay_hidden']
-    
-    class Meta:
-        widgets = {
-            'user_password': forms.PasswordInput(),
-        }
+            del self.fields['user_remember_me']

+ 2 - 17
misago/security/views.py

@@ -24,7 +24,6 @@ def signin(request):
         form = SignInForm(
         form = SignInForm(
                           request.POST,
                           request.POST,
                           show_remember_me=not request.firewall.admin and request.settings['remember_me_allow'],
                           show_remember_me=not request.firewall.admin and request.settings['remember_me_allow'],
-                          show_stay_hidden=not request.firewall.admin and request.settings['sessions_hidden'],
                           request=request
                           request=request
                           )
                           )
         if form.is_valid():
         if form.is_valid():
@@ -44,10 +43,7 @@ def signin(request):
                                   form.cleaned_data['user_password'],
                                   form.cleaned_data['user_password'],
                                   )
                                   )
                 
                 
-                if not request.firewall.admin and request.settings['sessions_hidden'] and form.cleaned_data['user_stay_hidden']:
-                    request.session.hidden = True                    
-                
-                sign_user_in(request, user, request.session.hidden)     
+                sign_user_in(request, user)     
                            
                            
                 remember_me_token = False
                 remember_me_token = False
                 if not request.firewall.admin and request.settings['remember_me_allow'] and form.cleaned_data['user_remember_me']:
                 if not request.firewall.admin and request.settings['remember_me_allow'] and form.cleaned_data['user_remember_me']:
@@ -57,7 +53,6 @@ def signin(request):
                                         user=user,
                                         user=user,
                                         created=timezone.now(),
                                         created=timezone.now(),
                                         accessed=timezone.now(),
                                         accessed=timezone.now(),
-                                        hidden=request.session.hidden
                                         )
                                         )
                     remember_me.save()
                     remember_me.save()
                 if remember_me_token:
                 if remember_me_token:
@@ -80,22 +75,12 @@ def signin(request):
     else:
     else:
         form = SignInForm(
         form = SignInForm(
                           show_remember_me=not request.firewall.admin and request.settings['remember_me_allow'],
                           show_remember_me=not request.firewall.admin and request.settings['remember_me_allow'],
-                          show_stay_hidden=not request.firewall.admin and request.settings['sessions_hidden'],
                           request=request
                           request=request
                           )
                           )
     return request.theme.render_to_response('signin.html',
     return request.theme.render_to_response('signin.html',
                                             {
                                             {
                                              'message': message,
                                              'message': message,
-                                             'form': FormLayout(form, [
-                                                 (
-                                                     None,
-                                                     [('user_email', {'attrs': {'placeholder': _("Enter your e-mail")}}), ('user_password', {'has_value': False, 'placeholder': _("Enter your password")})]
-                                                 ),
-                                                 (
-                                                     None,
-                                                     ['user_remember_me', 'user_stay_hidden'],
-                                                 ),
-                                             ]),
+                                             'form': FormLayout(form),
                                              'hide_signin': True, 
                                              'hide_signin': True, 
                                             },
                                             },
                                             context_instance=RequestContext(request));
                                             context_instance=RequestContext(request));

+ 3 - 0
misago/sessions/middleware.py

@@ -10,6 +10,9 @@ class SessionMiddleware(object):
             # Human Session
             # Human Session
             request.session = SessionHuman(request)
             request.session = SessionHuman(request)
             request.user = request.session.get_user()
             request.user = request.session.get_user()
+            
+            if request.settings['sessions_hidden'] and request.user.is_authenticated():
+                request.session.set_hidden(request.user.hide_activity > 0)
                     
                     
     def process_response(self, request, response):
     def process_response(self, request, response):
         try:
         try:

+ 1 - 2
misago/sessions/models.py

@@ -18,5 +18,4 @@ class Token(models.Model):
     id = models.CharField(max_length=42, primary_key=True)
     id = models.CharField(max_length=42, primary_key=True)
     user = models.ForeignKey('users.User', related_name='+')
     user = models.ForeignKey('users.User', related_name='+')
     created = models.DateTimeField()
     created = models.DateTimeField()
-    accessed = models.DateTimeField()
-    hidden = models.BooleanField(default=False)
+    accessed = models.DateTimeField()

+ 1 - 2
misago/sessions/sessions.py

@@ -232,5 +232,4 @@ class SessionHuman(SessionMisago):
         return self.hidden
         return self.hidden
     
     
     def set_hidden(self, hidden=False):
     def set_hidden(self, hidden=False):
-        if settings.SESSIONS_HIDDEN:
-            self.hidden = hidden
+        self.hidden = hidden

+ 1 - 1
misago/timezones/__init__.py

@@ -32,7 +32,7 @@ raw_tz = (
     ('America/Noronha', _('(UTC-02:00) Atlantic islands')),
     ('America/Noronha', _('(UTC-02:00) Atlantic islands')),
     ('Atlantic/Cape_Verde', _('(UTC-01:00) Cape Verde Time')),
     ('Atlantic/Cape_Verde', _('(UTC-01:00) Cape Verde Time')),
     ('Atlantic/Azores', _('(UTC-01:00) Azores, Scoresbysund'), _('(UTC) Azores, Scoresbysund')),
     ('Atlantic/Azores', _('(UTC-01:00) Azores, Scoresbysund'), _('(UTC) Azores, Scoresbysund')),
-    ('UTC', _('(UTC) Coordinated Universal Time')),
+    ('utc', _('(UTC) Coordinated Universal Time')),
     ('Africa/Dakar', _('(UTC) Dakar, Rabat')),
     ('Africa/Dakar', _('(UTC) Dakar, Rabat')),
     ('Europe/Lisbon', _('(UTC) Western European Time'), _('(UTC+01:00) Western European Summer Time')),
     ('Europe/Lisbon', _('(UTC) Western European Time'), _('(UTC+01:00) Western European Summer Time')),
     ('Africa/Algiers', _('(UTC+01:00) West Africa Time')),
     ('Africa/Algiers', _('(UTC+01:00) West Africa Time')),

+ 42 - 29
misago/users/forms.py

@@ -4,6 +4,7 @@ from django.core.exceptions import ValidationError
 from django.utils.translation import ugettext_lazy as _
 from django.utils.translation import ugettext_lazy as _
 from misago.forms import Form
 from misago.forms import Form
 from misago.security import captcha
 from misago.security import captcha
+from misago.timezones import tzlist
 from misago.users.models import User
 from misago.users.models import User
 from misago.users.validators import validate_password, validate_email
 from misago.users.validators import validate_password, validate_email
 
 
@@ -27,24 +28,24 @@ class UserRegisterForm(Form):
                        }]
                        }]
     
     
     layout = [
     layout = [
-                 (
-                     None,
-                     [('username', {'label': _('Username'), 'help_text': _("Your displayed username. Between 3 and 15 characters, only letters and digits are allowed."),'attrs': {'placeholder': _("Enter your desired username")}})]
-                 ),
-                 (
-                     None,
-                     [('nested', [('email', {'label': _('E-mail address'), 'help_text': _("Working e-mail inbox is required to maintain control over your forum account."), 'attrs': {'placeholder': _("Enter your e-mail")}, 'width': 50}), ('email_rep', {'attrs': {'placeholder': _("Repeat your e-mail")}, 'width': 50})]), 
-                      ('nested', [('password', {'label': _('Password'), 'help_text': _("Password you will be using to sign in to your account. Make sure it's strong."), 'has_value': False, 'attrs': {'placeholder': _("Enter your password")}, 'width': 50}), ('password_rep', {'has_value': False, 'attrs': {'placeholder': _("Repeat your password")}, 'width': 50})])]
-                 ),
-                 (
-                     None,
-                     ['captcha_qa', 'recaptcha']
-                 ),
-                 (
-                     None,
-                     [('accept_tos', {'label': _("Forum Terms of Service"), 'inline': _("I have read and accept this forums Terms of Service.")})]
-                 ),
-             ]
+              (
+               None,
+               [('username', {'label': _('Username'), 'help_text': _("Your displayed username. Between 3 and 15 characters, only letters and digits are allowed."),'attrs': {'placeholder': _("Enter your desired username")}})]
+               ),
+              (
+               None,
+               [('nested', [('email', {'label': _('E-mail address'), 'help_text': _("Working e-mail inbox is required to maintain control over your forum account."), 'attrs': {'placeholder': _("Enter your e-mail")}, 'width': 50}), ('email_rep', {'attrs': {'placeholder': _("Repeat your e-mail")}, 'width': 50})]), 
+               ('nested', [('password', {'label': _('Password'), 'help_text': _("Password you will be using to sign in to your account. Make sure it's strong."), 'has_value': False, 'attrs': {'placeholder': _("Enter your password")}, 'width': 50}), ('password_rep', {'has_value': False, 'attrs': {'placeholder': _("Repeat your password")}, 'width': 50})])]
+               ),
+              (
+               None,
+               ['captcha_qa', 'recaptcha']
+               ),
+              (
+               None,
+               [('accept_tos', {'label': _("Forum Terms of Service"), 'inline': _("I have read and accept this forums Terms of Service.")})]
+               ),
+              ]
         
         
     def clean_username(self):
     def clean_username(self):
         new_user = User.objects.get_blank_user()
         new_user = User.objects.get_blank_user()
@@ -76,21 +77,21 @@ class UserRegisterForm(Form):
     
     
     
     
 class UserSendSpecialMailForm(Form):
 class UserSendSpecialMailForm(Form):
-    email = forms.EmailField(max_length=255,label=_("Your E-mail Address"),help_text=_("Your account's email address."))
+    email = forms.EmailField(max_length=255)
     captcha_qa = captcha.QACaptchaField()
     captcha_qa = captcha.QACaptchaField()
     recaptcha = captcha.ReCaptchaField()
     recaptcha = captcha.ReCaptchaField()
     error_source = 'email'
     error_source = 'email'
     
     
     layout = [
     layout = [
-                  (
-                      None,
-                      [('email', {'placeholder': _("Enter your e-mail address.")})]
-                  ),
-                  (
-                      None,
-                      ['captcha_qa', 'recaptcha']
-                  ),
-             ]
+              (
+               None,
+               [('email', {'label': _("Your E-mail Address"), 'help_text': _("Your account's email address."), 'attrs': {'placeholder': _("Enter your e-mail address.")}})]
+               ),
+              (
+               None,
+               ['captcha_qa', 'recaptcha']
+               ),
+              ]
     
     
     def clean_email(self):
     def clean_email(self):
         try:
         try:
@@ -104,4 +105,16 @@ class UserSendSpecialMailForm(Form):
     
     
 class QuickFindUserForm(Form):
 class QuickFindUserForm(Form):
     username = forms.CharField()
     username = forms.CharField()
-    
+    
+
+class UserForumOptionsForm(Form):
+    timezone = forms.ChoiceField(choices=tzlist())
+    
+    layout = (
+              (
+               _("Date and Time"),
+               (
+                ('timezone', {'label': _("Your Current Timezone"), 'help_text': _("If dates and hours displayed by forums are inaccurate, you can fix it by adjusting timezone setting.")}),
+                )
+               ),
+              )

+ 1 - 1
misago/users/models.py

@@ -124,7 +124,7 @@ class User(models.Model):
     last_date = models.DateTimeField(null=True,blank=True)
     last_date = models.DateTimeField(null=True,blank=True)
     last_ip = models.GenericIPAddressField(null=True,blank=True)
     last_ip = models.GenericIPAddressField(null=True,blank=True)
     last_agent = models.TextField(null=True,blank=True)
     last_agent = models.TextField(null=True,blank=True)
-    hide_activity = models.BooleanField(default=False)
+    hide_activity = models.PositiveIntegerField(default=0)
     topics = models.PositiveIntegerField(default=0)
     topics = models.PositiveIntegerField(default=0)
     topics_delta = models.IntegerField(default=0)
     topics_delta = models.IntegerField(default=0)
     posts = models.PositiveIntegerField(default=0)
     posts = models.PositiveIntegerField(default=0)

+ 7 - 0
misago/users/views/usercp.py

@@ -1,14 +1,21 @@
 from django.core.urlresolvers import reverse
 from django.core.urlresolvers import reverse
 from django.shortcuts import redirect
 from django.shortcuts import redirect
 from django.template import RequestContext
 from django.template import RequestContext
+from misago.forms import FormLayout
 from misago.security.decorators import *
 from misago.security.decorators import *
+from misago.users.forms import UserForumOptionsForm
 
 
 
 
 @block_guest   
 @block_guest   
 def options(request):
 def options(request):
+    form = UserForumOptionsForm(request=request,initial={
+                                                         'timezone': request.user.timezone
+                                                         })
+    
     return request.theme.render_to_response('users/usercp/options.html',
     return request.theme.render_to_response('users/usercp/options.html',
                                             {
                                             {
                                              'tab': 'options',
                                              'tab': 'options',
+                                             'form': FormLayout(form)
                                              },
                                              },
                                             context_instance=RequestContext(request));
                                             context_instance=RequestContext(request));
     
     

+ 1 - 0
static/sora/css/sora.css

@@ -905,6 +905,7 @@ th.table-sort.sort-desc a:hover{border-bottom:3px solid #eca09a;padding-bottom:5
 .tabs-left ul li a:hover{opacity:0.9;filter:alpha(opacity=90);}
 .tabs-left ul li a:hover{opacity:0.9;filter:alpha(opacity=90);}
 .tabs-left ul li.active a,.tabs-left ul li.active a:link,.tabs-left ul li.active a:active,.tabs-left ul li.active a:visited,.tabs-left ul li.active a:hover{background-color:#fcfcfc;opacity:1;filter:alpha(opacity=100);color:#000000;}.tabs-left ul li.active a i,.tabs-left ul li.active a:link i,.tabs-left ul li.active a:active i,.tabs-left ul li.active a:visited i,.tabs-left ul li.active a:hover i{background-image:url("../img/glyphicons-halflings.png");}
 .tabs-left ul li.active a,.tabs-left ul li.active a:link,.tabs-left ul li.active a:active,.tabs-left ul li.active a:visited,.tabs-left ul li.active a:hover{background-color:#fcfcfc;opacity:1;filter:alpha(opacity=100);color:#000000;}.tabs-left ul li.active a i,.tabs-left ul li.active a:link i,.tabs-left ul li.active a:active i,.tabs-left ul li.active a:visited i,.tabs-left ul li.active a:hover i{background-image:url("../img/glyphicons-halflings.png");}
 .tabs-left ul li:first-child{padding-top:12px;}
 .tabs-left ul li:first-child{padding-top:12px;}
+.sidetabs-content{padding-top:0px;margin-top:-12px;}
 .navbar-fixed-top{position:static;}
 .navbar-fixed-top{position:static;}
 .navbar-userbar .navbar-inner{background:none;background-color:#fcfcfc;border-bottom:4px solid #e3e3e3;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;overflow:auto;}
 .navbar-userbar .navbar-inner{background:none;background-color:#fcfcfc;border-bottom:4px solid #e3e3e3;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;overflow:auto;}
 .navbar-userbar li a,.navbar-userbar li a:link,.navbar-userbar li a:active,.navbar-userbar li a:visited,.navbar-userbar li button.btn-link{opacity:0.5;filter:alpha(opacity=50);color:#000000;font-weight:bold;}.navbar-userbar li a i,.navbar-userbar li a:link i,.navbar-userbar li a:active i,.navbar-userbar li a:visited i,.navbar-userbar li button.btn-link i{opacity:1;filter:alpha(opacity=100);}
 .navbar-userbar li a,.navbar-userbar li a:link,.navbar-userbar li a:active,.navbar-userbar li a:visited,.navbar-userbar li button.btn-link{opacity:0.5;filter:alpha(opacity=50);color:#000000;font-weight:bold;}.navbar-userbar li a i,.navbar-userbar li a:link i,.navbar-userbar li a:active i,.navbar-userbar li a:visited i,.navbar-userbar li button.btn-link i{opacity:1;filter:alpha(opacity=100);}

+ 7 - 1
static/sora/css/sora/navs.less

@@ -88,4 +88,10 @@
       padding-top: 12px;
       padding-top: 12px;
     }
     }
   }
   }
-}
+}
+
+// Tabs content
+.sidetabs-content {
+  padding-top: 0px;
+  margin-top: -12px;
+}

+ 8 - 0
templates/sora/users/usercp/options.html

@@ -1,10 +1,18 @@
 {% extends "sora/users/usercp/usercp.html" %}
 {% extends "sora/users/usercp/usercp.html" %}
 {% load i18n %}
 {% load i18n %}
 {% load url from future %}
 {% load url from future %}
+{% import "_forms.html" as form_theme with context %}
 
 
 {% block title %}{% trans %}Change Forum Options{% endtrans %} | {{ settings.board_name }}{% endblock %}
 {% block title %}{% trans %}Change Forum Options{% endtrans %} | {{ settings.board_name }}{% endblock %}
 
 
 {% block action %}
 {% block action %}
 {{ super() }}
 {{ super() }}
 <h2>{% trans %}Change Forum Options{% endtrans %}</h2>
 <h2>{% trans %}Change Forum Options{% endtrans %}</h2>
+<form action="{{ url }}" method="post">
+  {{ form_theme.form_widget(form) }}
+  <div class="form-actions">
+  	<button name="save" type="submit" class="btn btn-primary">{% trans %}Change Options{% endtrans %}</button>
+  	<a href="{% url 'usercp' %}" class="btn">{% trans %}Cancel{% endtrans %}</a>
+  </div>
+</form>
 {% endblock %}
 {% endblock %}

+ 3 - 8
templates/sora/users/usercp/usercp.html

@@ -12,22 +12,17 @@
   <div class="span3">
   <div class="span3">
   	<div class="tabbable tabs-left">
   	<div class="tabbable tabs-left">
   	  <ul class="nav nav-tabs">
   	  <ul class="nav nav-tabs">
-        <li class="nav-header">{% trans %}Your Activity{% endtrans %}</li>
-        <li><a href="{% url 'usercp_ignored' %}"><i class="icon-fire"></i> {% trans %}Your Notifications{% endtrans %}</a></li>
-        <li><a href="{% url 'usercp_ignored' %}"><i class="icon-comment"></i> {% trans %}Your Posts{% endtrans %}</a></li>
         <li class="nav-header">{% trans %}Account Settings{% endtrans %}</li>
         <li class="nav-header">{% trans %}Account Settings{% endtrans %}</li>
-        <li><a href="{% url 'usercp_ignored' %}"><i class="icon-bookmark"></i> {% trans %}Threads you are watching{% endtrans %}</a></li>
-        <li><a href="{% url 'usercp_ignored' %}"><i class="icon-heart"></i> {% trans %}People you are following{% endtrans %}</a></li>
+  	    <li{% if tab == 'options' %} class="active"{% endif %}><a href="{% url 'usercp' %}"><i class="icon-cog"></i> {% trans %}Forum Options{% endtrans %}</a></li>
         <li{% if tab == 'avatar' %} class="active"{% endif %}><a href="{% url 'usercp_avatar' %}"><i class="icon-picture"></i> {% trans %}Change Avatar{% endtrans %}</a></li>
         <li{% if tab == 'avatar' %} class="active"{% endif %}><a href="{% url 'usercp_avatar' %}"><i class="icon-picture"></i> {% trans %}Change Avatar{% endtrans %}</a></li>
         <li{% if tab == 'signature' %} class="active"{% endif %}><a href="{% url 'usercp_signature' %}"><i class="icon-align-left"></i> {% trans %}Edit Signature{% endtrans %}</a></li>
         <li{% if tab == 'signature' %} class="active"{% endif %}><a href="{% url 'usercp_signature' %}"><i class="icon-align-left"></i> {% trans %}Edit Signature{% endtrans %}</a></li>
   	    <li{% if tab == 'credentials' %} class="active"{% endif %}><a href="{% url 'usercp_credentials' %}"><i class="icon-edit"></i> {% trans %}Change E-mail or Password{% endtrans %}</a></li>
   	    <li{% if tab == 'credentials' %} class="active"{% endif %}><a href="{% url 'usercp_credentials' %}"><i class="icon-edit"></i> {% trans %}Change E-mail or Password{% endtrans %}</a></li>
   	    <li{% if tab == 'username' %} class="active"{% endif %}><a href="{% url 'usercp_username' %}"><i class="icon-user"></i> {% trans %}Change Username{% endtrans %}</a></li>
   	    <li{% if tab == 'username' %} class="active"{% endif %}><a href="{% url 'usercp_username' %}"><i class="icon-user"></i> {% trans %}Change Username{% endtrans %}</a></li>
-  	    <li{% if tab == 'options' %} class="active"{% endif %}><a href="{% url 'usercp' %}"><i class="icon-cog"></i> {% trans %}Forum Options{% endtrans %}</a></li>
-        <li{% if tab == 'ignored' %} class="active"{% endif %}><a href="{% url 'usercp_ignored' %}"><i class="icon-eye-close"></i> {% trans %}People you ignore{% endtrans %}</a></li>
+        <li{% if tab == 'ignored' %} class="active"{% endif %}><a href="{% url 'usercp_ignored' %}"><i class="icon-eye-close"></i> {% trans %}Ignore People{% endtrans %}</a></li>
       </ul>
       </ul>
     </div>
     </div>
   </div>
   </div>
-  <div class="span9">
+  <div class="span9 sidetabs-content">
   	{% block action %}{% endblock %}
   	{% block action %}{% endblock %}
   </div>
   </div>
 </div>
 </div>