Compare commits
	
		
			9 Commits
		
	
	
		
			master
			...
			b1395a4b5d
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| b1395a4b5d | |||
| 4e03abcac8 | |||
| e9e09104ad | |||
| 95a847cee0 | |||
| 8281c1a4c9 | |||
| cbae38e893 | |||
| efd940f34f | |||
| 893f441ddd | |||
| cd76659ed9 | 
@ -30,7 +30,7 @@ class AdminSite(admin.AdminSite):
 | 
				
			|||||||
            'programs': Program.objects.active().values('pk', 'title') \
 | 
					            'programs': Program.objects.active().values('pk', 'title') \
 | 
				
			||||||
                                       .order_by('title'),
 | 
					                                       .order_by('title'),
 | 
				
			||||||
            # today's diffusions
 | 
					            # today's diffusions
 | 
				
			||||||
            'diffusions': Diffusion.objects.on_air().date().order_by('start') \
 | 
					            'diffusions': Diffusion.objects.date().order_by('start') \
 | 
				
			||||||
                                   .select_related('episode'),
 | 
					                                   .select_related('episode'),
 | 
				
			||||||
            # TODO: only for dashboard
 | 
					            # TODO: only for dashboard
 | 
				
			||||||
            # last comments
 | 
					            # last comments
 | 
				
			||||||
 | 
				
			|||||||
@ -23,6 +23,9 @@ from aircox.models import *
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
__doc__ = __doc__.format(settings=settings)
 | 
					__doc__ = __doc__.format(settings=settings)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					__all__ = ('PlaylistImport', 'Command')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
logger = logging.getLogger('aircox.commands')
 | 
					logger = logging.getLogger('aircox.commands')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -89,11 +92,10 @@ class PlaylistImport:
 | 
				
			|||||||
                    **self.track_kwargs
 | 
					                    **self.track_kwargs
 | 
				
			||||||
                )
 | 
					                )
 | 
				
			||||||
                track.timestamp = timestamp
 | 
					                track.timestamp = timestamp
 | 
				
			||||||
                print('track', track, timestamp)
 | 
					 | 
				
			||||||
                track.info = line.get('info')
 | 
					                track.info = line.get('info')
 | 
				
			||||||
                tags = line.get('tags')
 | 
					                tags = line.get('tags')
 | 
				
			||||||
                if tags:
 | 
					                if tags:
 | 
				
			||||||
                    track.tags.add(*tags.split(','))
 | 
					                    track.tags.add(*tags.lower().split(','))
 | 
				
			||||||
            except Exception as err:
 | 
					            except Exception as err:
 | 
				
			||||||
                logger.warning(
 | 
					                logger.warning(
 | 
				
			||||||
                    'an error occured for track {index}, it may not '
 | 
					                    'an error occured for track {index}, it may not '
 | 
				
			||||||
 | 
				
			|||||||
@ -62,6 +62,13 @@ class Episode(Page):
 | 
				
			|||||||
            raise ValueError('missing parent program')
 | 
					            raise ValueError('missing parent program')
 | 
				
			||||||
        super().save(*args, **kwargs)
 | 
					        super().save(*args, **kwargs)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @classmethod
 | 
				
			||||||
 | 
					    def get_default_title(cls, page, date):
 | 
				
			||||||
 | 
					        return settings.AIRCOX_EPISODE_TITLE.format(
 | 
				
			||||||
 | 
					            program=page,
 | 
				
			||||||
 | 
					            date=date.strftime(settings.AIRCOX_EPISODE_TITLE_DATE_FORMAT)
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @classmethod
 | 
					    @classmethod
 | 
				
			||||||
    def get_init_kwargs_from(cls, page, date, title=None, **kwargs):
 | 
					    def get_init_kwargs_from(cls, page, date, title=None, **kwargs):
 | 
				
			||||||
        """ Get default Episode's title  """
 | 
					        """ Get default Episode's title  """
 | 
				
			||||||
@ -252,7 +259,7 @@ class Diffusion(BaseRerun):
 | 
				
			|||||||
        return self.type == self.TYPE_ON_AIR and \
 | 
					        return self.type == self.TYPE_ON_AIR and \
 | 
				
			||||||
            self.start <= now and self.end >= now
 | 
					            self.start <= now and self.end >= now
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # TODO: property?
 | 
					    @property
 | 
				
			||||||
    def is_live(self):
 | 
					    def is_live(self):
 | 
				
			||||||
        """ True if Diffusion is live (False if there are sounds files). """
 | 
					        """ True if Diffusion is live (False if there are sounds files). """
 | 
				
			||||||
        return self.type == self.TYPE_ON_AIR and \
 | 
					        return self.type == self.TYPE_ON_AIR and \
 | 
				
			||||||
 | 
				
			|||||||
@ -16,7 +16,31 @@
 | 
				
			|||||||
                <tr {% if diffusion.is_now %}class="is-selected"{% endif %}>
 | 
					                <tr {% if diffusion.is_now %}class="is-selected"{% endif %}>
 | 
				
			||||||
                    <td>{{ diffusion.start|time }} - {{ diffusion.end|time }}</td>
 | 
					                    <td>{{ diffusion.start|time }} - {{ diffusion.end|time }}</td>
 | 
				
			||||||
                    <td><img src="{% thumbnail episode.cover 64x64 crop %}"/></td>
 | 
					                    <td><img src="{% thumbnail episode.cover 64x64 crop %}"/></td>
 | 
				
			||||||
                    <td><a href="{% url "admin:aircox_episode_change" episode.pk %}">{{ episode.title }}</a></td>
 | 
					                    <td>
 | 
				
			||||||
 | 
					                        <a href="{% url "admin:aircox_episode_change" episode.pk %}">{{ episode.title }}</a>
 | 
				
			||||||
 | 
					                         
 | 
				
			||||||
 | 
					                        {% if diffusion.type == diffusion.TYPE_ON_AIR %}
 | 
				
			||||||
 | 
					                        <span class="tag is-info">
 | 
				
			||||||
 | 
					                            <span class="icon is-small">
 | 
				
			||||||
 | 
					                                {% if diffusion.is_live %}
 | 
				
			||||||
 | 
					                                <i class="fa fa-microphone"
 | 
				
			||||||
 | 
					                                    title="{% trans "Live diffusion" %}"></i>
 | 
				
			||||||
 | 
					                                {% else %}
 | 
				
			||||||
 | 
					                                <i class="fa fa-music"
 | 
				
			||||||
 | 
					                                    title="{% trans "Differed diffusion" %}"></i>
 | 
				
			||||||
 | 
					                                {% endif %}
 | 
				
			||||||
 | 
					                            </span>
 | 
				
			||||||
 | 
					                             
 | 
				
			||||||
 | 
					                            {{ diffusion.get_type_display }}
 | 
				
			||||||
 | 
					                        </span>
 | 
				
			||||||
 | 
					                        {% elif diffusion.type == diffusion.TYPE_CANCEL %}
 | 
				
			||||||
 | 
					                        <span class="tag is-danger">
 | 
				
			||||||
 | 
					                            {{ diffusion.get_type_display }}</span>
 | 
				
			||||||
 | 
					                        {% elif diffusion.type == diffusion.TYPE_UNCONFIRMED %}
 | 
				
			||||||
 | 
					                        <span class="tag is-warning">
 | 
				
			||||||
 | 
					                            {{ diffusion.get_type_display }}</span>
 | 
				
			||||||
 | 
					                        {% endif %}
 | 
				
			||||||
 | 
					                    </td>
 | 
				
			||||||
                </tr>
 | 
					                </tr>
 | 
				
			||||||
                {% endwith %}
 | 
					                {% endwith %}
 | 
				
			||||||
                {% endfor %}
 | 
					                {% endfor %}
 | 
				
			||||||
 | 
				
			|||||||
@ -56,6 +56,10 @@ Usefull context:
 | 
				
			|||||||
                            {% endfor %}
 | 
					                            {% endfor %}
 | 
				
			||||||
                            {% endblock %}
 | 
					                            {% endblock %}
 | 
				
			||||||
                        </div>
 | 
					                        </div>
 | 
				
			||||||
 | 
					                        <div class="navbar-end">
 | 
				
			||||||
 | 
					                            {% block top-nav-tools %}
 | 
				
			||||||
 | 
					                            {% endblock %}
 | 
				
			||||||
 | 
					                        </div>
 | 
				
			||||||
                    </div>
 | 
					                    </div>
 | 
				
			||||||
                </div>
 | 
					                </div>
 | 
				
			||||||
            </nav>
 | 
					            </nav>
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,5 @@
 | 
				
			|||||||
{% extends "aircox/basepage_detail.html" %}
 | 
					{% extends "aircox/basepage_detail.html" %}
 | 
				
			||||||
{% load static i18n humanize honeypot %}
 | 
					{% load static i18n humanize honeypot aircox %}
 | 
				
			||||||
{% comment %}
 | 
					{% comment %}
 | 
				
			||||||
Base template used to display a Page
 | 
					Base template used to display a Page
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -14,6 +14,19 @@ Context:
 | 
				
			|||||||
{% endif %}
 | 
					{% endif %}
 | 
				
			||||||
{% endblock %}
 | 
					{% endblock %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{% block top-nav-tools %}
 | 
				
			||||||
 | 
					{% has_perm page "change" as can_edit %}
 | 
				
			||||||
 | 
					{% if can_edit %}
 | 
				
			||||||
 | 
					<a class="navbar-item" href="{{ page|admin_url:'change' }}"
 | 
				
			||||||
 | 
					    target="new">
 | 
				
			||||||
 | 
					    <span class="icon is-small">
 | 
				
			||||||
 | 
					        <i class="fa fa-pen"></i>
 | 
				
			||||||
 | 
					    </span> 
 | 
				
			||||||
 | 
					    <span>{% trans "Edit" %}</span>
 | 
				
			||||||
 | 
					</a>
 | 
				
			||||||
 | 
					{% endif %}
 | 
				
			||||||
 | 
					{% endblock %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{% block main %}
 | 
					{% block main %}
 | 
				
			||||||
{{ block.super }}
 | 
					{{ block.super }}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										65
									
								
								aircox/templates/aircox/widgets/basepage_item.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								aircox/templates/aircox/widgets/basepage_item.html
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,65 @@
 | 
				
			|||||||
 | 
					{% load i18n easy_thumbnails_tags aircox %}
 | 
				
			||||||
 | 
					{% comment %}
 | 
				
			||||||
 | 
					List item for a page
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Context variables:
 | 
				
			||||||
 | 
					- object: the object to render
 | 
				
			||||||
 | 
					- render_card: render as card
 | 
				
			||||||
 | 
					- is-primary: render as primary
 | 
				
			||||||
 | 
					- has_headline (=False): if True, display headline
 | 
				
			||||||
 | 
					- has_cover (=True): hide page cover
 | 
				
			||||||
 | 
					{% endcomment %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{% if render_card %}
 | 
				
			||||||
 | 
					<article class="card {% if is_primary %}is-primary{% endif %}">
 | 
				
			||||||
 | 
					    <header class="card-image">
 | 
				
			||||||
 | 
					        <figure class="image is-4by3">
 | 
				
			||||||
 | 
					            <img src="{% thumbnail object.cover|default:station.default_cover 480x480 %}">
 | 
				
			||||||
 | 
					        </figure>
 | 
				
			||||||
 | 
					    </header>
 | 
				
			||||||
 | 
					    <div class="card-header">
 | 
				
			||||||
 | 
					        <h4 class="title">
 | 
				
			||||||
 | 
					            <a href="{{ object.get_absolute_url }}">
 | 
				
			||||||
 | 
					                {% block card_title %}{{ object.title }}{% endblock %}
 | 
				
			||||||
 | 
					            </a>
 | 
				
			||||||
 | 
					        </h4>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					</article>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{% else %}
 | 
				
			||||||
 | 
					<article class="media item {% block css %}{% endblock%}">
 | 
				
			||||||
 | 
					    {% if has_cover|default_if_none:True %}
 | 
				
			||||||
 | 
					    <div class="media-left">
 | 
				
			||||||
 | 
					        <img src="{% thumbnail object.cover|default:station.default_cover 128x128 crop=scale %}"
 | 
				
			||||||
 | 
					            class="cover is-small">
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					    {% endif %}
 | 
				
			||||||
 | 
					    <div class="media-content">
 | 
				
			||||||
 | 
					        <h5 class="title is-5 has-text-weight-normal">
 | 
				
			||||||
 | 
					            {% block title %}
 | 
				
			||||||
 | 
					            {% if object.is_published %}
 | 
				
			||||||
 | 
					            <a href="{{ object.get_absolute_url }}">{{ object.title }}</a>
 | 
				
			||||||
 | 
					            {% else %}
 | 
				
			||||||
 | 
					            {{ object.title }}
 | 
				
			||||||
 | 
					            {% endif %}
 | 
				
			||||||
 | 
					            {% endblock %}
 | 
				
			||||||
 | 
					        </h5>
 | 
				
			||||||
 | 
					        <div class="subtitle is-6 has-text-weight-light">
 | 
				
			||||||
 | 
					            {% block subtitle %}
 | 
				
			||||||
 | 
					            {% if object.category %}{{ object.category.title }}{% endif %}
 | 
				
			||||||
 | 
					            {% endblock %}
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        {% if has_headline|default_if_none:True %}
 | 
				
			||||||
 | 
					        <div class="headline">
 | 
				
			||||||
 | 
					        {% block headline %}{{ object.headline }}{% endblock %}
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					        {% endif %}
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    {% block actions %}{% endblock %}
 | 
				
			||||||
 | 
					</article>
 | 
				
			||||||
 | 
					{% endif %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -13,7 +13,11 @@ Context variables:
 | 
				
			|||||||
{% block title %}
 | 
					{% block title %}
 | 
				
			||||||
{% if not object.is_published and object.program.is_published %}
 | 
					{% if not object.is_published and object.program.is_published %}
 | 
				
			||||||
<a href="{{ object.program.get_absolute_url }}">
 | 
					<a href="{{ object.program.get_absolute_url }}">
 | 
				
			||||||
    {{ object.title }}
 | 
					    {{ object.program.title }}
 | 
				
			||||||
 | 
					    {% if diffusion %}
 | 
				
			||||||
 | 
					    —
 | 
				
			||||||
 | 
					    {{ diffusion.start|date:"d F" }}
 | 
				
			||||||
 | 
					    {% endif %}
 | 
				
			||||||
</a>
 | 
					</a>
 | 
				
			||||||
{% else %}
 | 
					{% else %}
 | 
				
			||||||
{{ block.super }}
 | 
					{{ block.super }}
 | 
				
			||||||
 | 
				
			|||||||
@ -1,62 +1,6 @@
 | 
				
			|||||||
{% load i18n easy_thumbnails_tags aircox %}
 | 
					{% extends "aircox/widgets/basepage_item.html" %}
 | 
				
			||||||
{% comment %}
 | 
					 | 
				
			||||||
List item for a page
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
Context variables:
 | 
					{% block card_title %}
 | 
				
			||||||
- object: the object to render
 | 
					{% block title %}{{ block.super }}{% endblock %}
 | 
				
			||||||
- render_card: render as card
 | 
					{% endblock %}
 | 
				
			||||||
- is-primary: render as primary
 | 
					 | 
				
			||||||
- has_headline (=False): if True, display headline
 | 
					 | 
				
			||||||
- has_cover (=True): hide page cover
 | 
					 | 
				
			||||||
{% endcomment %}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
{% if render_card %}
 | 
					 | 
				
			||||||
<article class="card {% if is_primary %}is-primary{% endif %}">
 | 
					 | 
				
			||||||
    <header class="card-image">
 | 
					 | 
				
			||||||
        <figure class="image is-4by3">
 | 
					 | 
				
			||||||
            <img src="{% thumbnail object.cover|default:station.default_cover 480x480 %}">
 | 
					 | 
				
			||||||
        </figure>
 | 
					 | 
				
			||||||
    </header>
 | 
					 | 
				
			||||||
    <div class="card-header">
 | 
					 | 
				
			||||||
        <h4 class="title">
 | 
					 | 
				
			||||||
            <a href="{{ object.get_absolute_url }}">{{ object.title }}</a>
 | 
					 | 
				
			||||||
        </h4>
 | 
					 | 
				
			||||||
    </div>
 | 
					 | 
				
			||||||
</article>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
{% else %}
 | 
					 | 
				
			||||||
<article class="media item {% block css %}{% endblock%}">
 | 
					 | 
				
			||||||
    {% if has_cover|default_if_none:True %}
 | 
					 | 
				
			||||||
    <div class="media-left">
 | 
					 | 
				
			||||||
        <img src="{% thumbnail object.cover|default:station.default_cover 128x128 crop=scale %}"
 | 
					 | 
				
			||||||
            class="cover is-small">
 | 
					 | 
				
			||||||
    </div>
 | 
					 | 
				
			||||||
    {% endif %}
 | 
					 | 
				
			||||||
    <div class="media-content">
 | 
					 | 
				
			||||||
        <h5 class="title is-5 has-text-weight-normal">
 | 
					 | 
				
			||||||
            {% block title %}
 | 
					 | 
				
			||||||
            {% if object.is_published %}
 | 
					 | 
				
			||||||
            <a href="{{ object.get_absolute_url }}">{{ object.title }}</a>
 | 
					 | 
				
			||||||
            {% else %}
 | 
					 | 
				
			||||||
            {{ object.title }}
 | 
					 | 
				
			||||||
            {% endif %}
 | 
					 | 
				
			||||||
            {% endblock %}
 | 
					 | 
				
			||||||
        </h5>
 | 
					 | 
				
			||||||
        <div class="subtitle is-6 has-text-weight-light">
 | 
					 | 
				
			||||||
            {% block subtitle %}
 | 
					 | 
				
			||||||
            {% if object.category %}{{ object.category.title }}{% endif %}
 | 
					 | 
				
			||||||
            {% endblock %}
 | 
					 | 
				
			||||||
        </div>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        {% if has_headline|default_if_none:True %}
 | 
					 | 
				
			||||||
        <div class="headline">
 | 
					 | 
				
			||||||
        {% block headline %}{{ object.headline }}{% endblock %}
 | 
					 | 
				
			||||||
        </div>
 | 
					 | 
				
			||||||
        {% endif %}
 | 
					 | 
				
			||||||
    </div>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    {% block actions %}{% endblock %}
 | 
					 | 
				
			||||||
</article>
 | 
					 | 
				
			||||||
{% endif %}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -2,6 +2,8 @@ import random
 | 
				
			|||||||
import json
 | 
					import json
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from django import template
 | 
					from django import template
 | 
				
			||||||
 | 
					from django.contrib.admin.templatetags.admin_urls import admin_urlname
 | 
				
			||||||
 | 
					from django.urls import reverse
 | 
				
			||||||
from django.utils.safestring import mark_safe
 | 
					from django.utils.safestring import mark_safe
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from aircox.models import Page, Diffusion, Log
 | 
					from aircox.models import Page, Diffusion, Log
 | 
				
			||||||
@ -10,6 +12,12 @@ random.seed()
 | 
				
			|||||||
register = template.Library()
 | 
					register = template.Library()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@register.filter(name='admin_url')
 | 
				
			||||||
 | 
					def do_admin_url(obj, arg, pass_id=True):
 | 
				
			||||||
 | 
					    """ Reverse admin url for object """
 | 
				
			||||||
 | 
					    name = admin_urlname(obj._meta, arg)
 | 
				
			||||||
 | 
					    return reverse(name, args=(obj.id,)) if pass_id else reverse(name)
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
@register.filter(name='get_tracks')
 | 
					@register.filter(name='get_tracks')
 | 
				
			||||||
def do_get_tracks(obj):
 | 
					def do_get_tracks(obj):
 | 
				
			||||||
    """ Get a list of track for the provided log, diffusion, or episode """
 | 
					    """ Get a list of track for the provided log, diffusion, or episode """
 | 
				
			||||||
@ -20,6 +28,14 @@ def do_get_tracks(obj):
 | 
				
			|||||||
        obj = obj.episode
 | 
					        obj = obj.episode
 | 
				
			||||||
    return obj.track_set.all()
 | 
					    return obj.track_set.all()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@register.simple_tag(name='has_perm', takes_context=True)
 | 
				
			||||||
 | 
					def do_has_perm(context, obj, perm, user=None):
 | 
				
			||||||
 | 
					    """ Return True if ``user.has_perm('[APP].[perm]_[MODEL]')`` """
 | 
				
			||||||
 | 
					    if user is None:
 | 
				
			||||||
 | 
					        user = context['request'].user
 | 
				
			||||||
 | 
					    return user.has_perm('{}.{}_{}'.format(
 | 
				
			||||||
 | 
					        obj._meta.app_label, perm, obj._meta.model_name))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@register.filter(name='is_diffusion')
 | 
					@register.filter(name='is_diffusion')
 | 
				
			||||||
def do_is_diffusion(obj):
 | 
					def do_is_diffusion(obj):
 | 
				
			||||||
    """ Return True if object is a Diffusion. """
 | 
					    """ Return True if object is a Diffusion. """
 | 
				
			||||||
 | 
				
			|||||||
@ -118,6 +118,8 @@ except:
 | 
				
			|||||||
    )
 | 
					    )
 | 
				
			||||||
    pass
 | 
					    pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#-- django-taggit
 | 
				
			||||||
 | 
					TAGGIT_CASE_INSENSITIVE = True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#-- django-CKEditor
 | 
					#-- django-CKEditor
 | 
				
			||||||
CKEDITOR_CONFIGS = {
 | 
					CKEDITOR_CONFIGS = {
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user