Remove lifetime.
This commit is contained in:
parent
e03b8635dd
commit
a3365f3901
|
@ -17,8 +17,6 @@ class PasteForm(ModelForm):
|
||||||
"language",
|
"language",
|
||||||
"title",
|
"title",
|
||||||
"content",
|
"content",
|
||||||
"lifetime",
|
|
||||||
"lifecount",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
def save(self, commit=True):
|
def save(self, commit=True):
|
||||||
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
# Generated by Django 4.2 on 2023-04-21 07:44
|
||||||
|
|
||||||
|
from django.db import migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
dependencies = [
|
||||||
|
("paste", "0004_remove_paste_password_remove_paste_salt_and_more"),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name="paste",
|
||||||
|
name="expired",
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name="paste",
|
||||||
|
name="lifecount",
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name="paste",
|
||||||
|
name="lifetime",
|
||||||
|
),
|
||||||
|
]
|
|
@ -52,65 +52,22 @@ class Paste(models.Model):
|
||||||
)
|
)
|
||||||
size = models.IntegerField(default=0, editable=False)
|
size = models.IntegerField(default=0, editable=False)
|
||||||
paste_time = models.DateTimeField(default=datetime.now, editable=False)
|
paste_time = models.DateTimeField(default=datetime.now, editable=False)
|
||||||
lifetime = models.IntegerField(
|
|
||||||
default=settings.PASTE["default_lifetime"], choices=EXPIRE_CHOICES
|
|
||||||
)
|
|
||||||
lifecount = models.IntegerField(default=0, blank=True)
|
|
||||||
viewcount = models.IntegerField(default=0, editable=False)
|
viewcount = models.IntegerField(default=0, editable=False)
|
||||||
expired = models.BooleanField(default=False, editable=False)
|
|
||||||
|
|
||||||
def compute_size(self):
|
def compute_size(self):
|
||||||
"""Computes size."""
|
"""Computes size."""
|
||||||
self.size = len(self.content)
|
self.size = len(self.content)
|
||||||
|
|
||||||
def is_expired(self):
|
|
||||||
"""Return expiration status."""
|
|
||||||
if self.expired or self.time_expired() or self.view_expired():
|
|
||||||
return True
|
|
||||||
return False
|
|
||||||
|
|
||||||
def time_expired(self):
|
|
||||||
"""Check if paste lifetime is over."""
|
|
||||||
if not self.lifetime or self.lifetime - self.get_age() > 0:
|
|
||||||
return False
|
|
||||||
self.mark_expired()
|
|
||||||
return True
|
|
||||||
|
|
||||||
def get_age(self):
|
def get_age(self):
|
||||||
"""Return age in minutes"""
|
"""Return age in minutes"""
|
||||||
delta = timezone.now() - self.paste_time
|
delta = timezone.now() - self.paste_time
|
||||||
return divmod(delta.days * 86400 + delta.seconds, 60)[0]
|
return divmod(delta.days * 86400 + delta.seconds, 60)[0]
|
||||||
|
|
||||||
def expiration_time(self):
|
|
||||||
"""Return expiration time"""
|
|
||||||
if not self.lifetime:
|
|
||||||
return None
|
|
||||||
delta = timedelta(minutes=self.lifetime)
|
|
||||||
return self.paste_time + delta
|
|
||||||
|
|
||||||
def mark_expired(self):
|
|
||||||
"""Mark paste expired."""
|
|
||||||
self.expired = True
|
|
||||||
self.save()
|
|
||||||
|
|
||||||
def incr_viewcount(self):
|
def incr_viewcount(self):
|
||||||
"""Increment view counter."""
|
"""Increment view counter."""
|
||||||
self.viewcount = self.viewcount + 1
|
self.viewcount = self.viewcount + 1
|
||||||
self.save()
|
self.save()
|
||||||
|
|
||||||
def view_expired(self):
|
|
||||||
"""Check if paste view count is over."""
|
|
||||||
if not self.lifecount:
|
|
||||||
return False
|
|
||||||
if self.lifecount <= self.viewcount:
|
|
||||||
self.mark_expired()
|
|
||||||
return True
|
|
||||||
return False
|
|
||||||
|
|
||||||
def __unicode__(self):
|
|
||||||
"""String representation."""
|
|
||||||
return self.slug
|
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
excerpt = repr(self.content[:100]) + ("..." if len(self.content) > 100 else "")
|
excerpt = repr(self.content[:100]) + ("..." if len(self.content) > 100 else "")
|
||||||
return "{} - {} - {}".format(self.slug, self.title, excerpt)
|
return "{} - {} - {}".format(self.slug, self.title, excerpt)
|
||||||
|
|
|
@ -17,13 +17,6 @@ def render_pygments(request, paste, data):
|
||||||
return HttpResponse(rendered)
|
return HttpResponse(rendered)
|
||||||
|
|
||||||
|
|
||||||
def render_form(request, paste, data):
|
|
||||||
"""Renders Form template."""
|
|
||||||
data["paste"] = paste
|
|
||||||
rendered = loader.render_to_string("paste/show-form.html", data, request)
|
|
||||||
return HttpResponse(rendered)
|
|
||||||
|
|
||||||
|
|
||||||
def render_raw(request, paste, data):
|
def render_raw(request, paste, data):
|
||||||
"""Renders RAW content."""
|
"""Renders RAW content."""
|
||||||
return HttpResponse(paste.content, content_type="text/plain")
|
return HttpResponse(paste.content, content_type="text/plain")
|
||||||
|
|
|
@ -1,10 +0,0 @@
|
||||||
{% extends "base.html" %}
|
|
||||||
{% load i18n %}
|
|
||||||
{% block title %}{{ title }}{% endblock %}
|
|
||||||
{% block content %}
|
|
||||||
<h1>{{ title }}</h1>
|
|
||||||
<div id="expired">
|
|
||||||
<p><b>{% blocktrans %}This paste has expired{% endblocktrans %}</b>.</p>
|
|
||||||
<p>{% blocktrans %}Sorry but the paste you try to access has expired{% endblocktrans %}.</p>
|
|
||||||
</div>
|
|
||||||
{% endblock %}
|
|
|
@ -32,30 +32,6 @@
|
||||||
{{ form.language.errors }}
|
{{ form.language.errors }}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="col-auto">
|
|
||||||
<label class="sr-only" for="id_lifetime">{% trans 'Expire time' %}</label>
|
|
||||||
<div class="input-group">
|
|
||||||
<div class="input-group-prepend">
|
|
||||||
<div class="input-group-text"><span class="add-on"><i class="icon-time"></i></span></div>
|
|
||||||
</div>
|
|
||||||
{{ form.lifetime|add_class:"form-control" }}
|
|
||||||
</div>
|
|
||||||
{{ form.lifetime.errors }}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{% if PASTE.has_expire_by_views %}
|
|
||||||
<div class="col-auto">
|
|
||||||
<label class="sr-only" for="id_lifecount">{% trans 'Expire allowed views' %}</label>
|
|
||||||
<div class="input-group">
|
|
||||||
<div class="input-group-prepend">
|
|
||||||
<div class="input-group-text"><span class="add-on"><i class="icon-refresh"></i></span></div>
|
|
||||||
</div>
|
|
||||||
{{ form.lifecount|add_class:"form-control" }}
|
|
||||||
</div>
|
|
||||||
{{ form.lifecount.errors }}
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
<div class="col-auto">
|
<div class="col-auto">
|
||||||
<button class="btn btn-primary btn-lg" type="submit">{% trans 'Paste' %}</button>
|
<button class="btn btn-primary btn-lg" type="submit">{% trans 'Paste' %}</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,31 +0,0 @@
|
||||||
{% load i18n %}
|
|
||||||
{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}
|
|
||||||
{% if PASTE.has_meta_table %}
|
|
||||||
<table class="table table-striped table-bordered">
|
|
||||||
<tr>
|
|
||||||
<th>#</th>
|
|
||||||
<th>{% trans 'Language' %}</th>
|
|
||||||
<th>{% trans 'Size' %}</th>
|
|
||||||
<th>{% trans 'Paste time' %}</th>
|
|
||||||
<th>{% trans 'Visibility' %}</th>
|
|
||||||
<th>{% trans 'Protection' %}</th>
|
|
||||||
<th>{% trans 'Views' %}</th>
|
|
||||||
<th>{% trans 'Expire time' %}</th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>{{ paste.id }}</td>
|
|
||||||
<td>{% trans paste.language.name %}</td>
|
|
||||||
<td>{{ paste.size }}</td>
|
|
||||||
<td>{{ paste.paste_time }}</td>
|
|
||||||
<td>{{ paste.viewcount }}{% if paste.lifecount > 0 %}/{{ paste.lifecount }}{% endif %}</td>
|
|
||||||
<td>{% if paste.expiration_time %}{{ paste.expiration_time }}{% else %}{% trans 'None' %}{% endif %}</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
{% endif %}
|
|
||||||
<div class="row">
|
|
||||||
<div class="span9">
|
|
||||||
{% if PASTE.has_title %}
|
|
||||||
<h1>{{ paste.title|truncatechars:50 }}</h1>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
|
@ -1,14 +0,0 @@
|
||||||
{% extends "base.html" %}
|
|
||||||
|
|
||||||
{% block title %}{{ title }}{% endblock %}
|
|
||||||
{% block content %}
|
|
||||||
{% include "paste/paste-meta.html" %}
|
|
||||||
<form><textarea id="id_content">{{ paste.content }}</textarea></form>
|
|
||||||
{% endblock %}
|
|
||||||
{% block javascript %}
|
|
||||||
<script>
|
|
||||||
$(document).ready(function() {
|
|
||||||
$("#id_content").autoGrow();
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
{% endblock %}
|
|
|
@ -6,5 +6,4 @@
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
{{ highlighted|safe }}
|
{{ highlighted|safe }}
|
||||||
{% include "paste/paste-meta.html" %}
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -56,8 +56,6 @@ def show(request, slug, renderer="pygments"):
|
||||||
paste = get_object_or_404(Paste, slug=slug)
|
paste = get_object_or_404(Paste, slug=slug)
|
||||||
data = {"title": paste.title, "slug": slug}
|
data = {"title": paste.title, "slug": slug}
|
||||||
# Handling expiration
|
# Handling expiration
|
||||||
if paste.is_expired():
|
|
||||||
return render(request, "paste/expired.html")
|
|
||||||
# Before rendering actions
|
# Before rendering actions
|
||||||
paste.incr_viewcount()
|
paste.incr_viewcount()
|
||||||
# Handling rendering modes
|
# Handling rendering modes
|
||||||
|
|
|
@ -92,7 +92,6 @@ INSTALLED_APPS = (
|
||||||
|
|
||||||
PASTE = {
|
PASTE = {
|
||||||
"has_title": False,
|
"has_title": False,
|
||||||
"has_expire_by_views": False,
|
|
||||||
"has_meta_table": False,
|
"has_meta_table": False,
|
||||||
"enabled_renderers": ["pygments", "raw"],
|
"enabled_renderers": ["pygments", "raw"],
|
||||||
"default_renderer": "pygments",
|
"default_renderer": "pygments",
|
||||||
|
|
Loading…
Reference in New Issue