diff --git a/accounts/models.py b/accounts/models.py index 2e5bfe6..53f4810 100644 --- a/accounts/models.py +++ b/accounts/models.py @@ -36,7 +36,7 @@ class UserProfile(models.Model): ) # User - user = models.OneToOneField(User, on_delete=models.DO_NOTHING) + user = models.OneToOneField(User, on_delete=models.CASCADE) is_pro = models.BooleanField(default=False) teams_beta_seen = models.BooleanField(default=False) teams_beta_applied = models.BooleanField(default=False) diff --git a/settings.py b/settings.py index 9ef4710..d1f68f8 100644 --- a/settings.py +++ b/settings.py @@ -16,7 +16,7 @@ BASE_PATH = os.path.dirname(__file__) CSRF_COOKIE_SECURE = True if "USE_SSL" in os.environ else False CORS_ORIGIN_ALLOW_ALL = True DEBUG = True if "DEBUG" in os.environ else False -DEFAULT_FROM_EMAIL = os.environ.get("POSTMARK_EMAIL", "support@siftie.com") +DEFAULT_FROM_EMAIL = os.environ.get("POSTMARK_EMAIL", "team@siftie.com") EMAIL_BACKEND = "postmark.django_backend.EmailBackend" # HAYSTACK_CONNECTIONS = { # "default": { @@ -52,7 +52,7 @@ SECRET_KEY = os.environ.get("SECRET_KEY", "changeme") SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https") SECURE_SSL_REDIRECT = True if "USE_SSL" in os.environ else False SEND_BROKEN_LINK_EMAILS = False -SERVER_EMAIL = os.environ.get("POSTMARK_EMAIL", "support@siftie.com") +SERVER_EMAIL = os.environ.get("POSTMARK_EMAIL", "team@siftie.com") SESSION_COOKIE_AGE = 15801100 SESSION_COOKIE_SECURE = True if "USE_SSL" in os.environ else False SITE_ID = 1 @@ -65,7 +65,7 @@ STATICFILES_STORAGE = "whitenoise.django.GzipManifestStaticFilesStorage" STATIC_ROOT = os.path.join(BASE_PATH, "static") STATIC_URL = "/static/" TASTYPIE_CANNED_ERROR = """There was an error with your request. The site - developers have a record of this error, please email support@siftie.com and + developers have a record of this error, please email team@siftie.com and we'll help you out.""" TEMPLATES = [ diff --git a/snipts/models.py b/snipts/models.py index 0e88610..074b5c8 100644 --- a/snipts/models.py +++ b/snipts/models.py @@ -22,13 +22,13 @@ from teams.models import Team class Snipt(models.Model): """An individual Snipt.""" - user = models.ForeignKey(User, blank=True, null=True, on_delete=models.DO_NOTHING) + user = models.ForeignKey(User, blank=True, null=True, on_delete=models.CASCADE) last_user_saved = models.ForeignKey( User, blank=True, null=True, related_name="last_user_saved", - on_delete=models.DO_NOTHING, + on_delete=models.CASCADE, ) title = models.CharField(max_length=255, blank=True, null=True, default="Untitled") @@ -313,8 +313,8 @@ class Snipt(models.Model): class SniptLogEntry(models.Model): """An individual log entry for a snippet changeset.""" - user = models.ForeignKey(User, on_delete=models.DO_NOTHING) - snipt = models.ForeignKey(Snipt, on_delete=models.DO_NOTHING) + user = models.ForeignKey(User, on_delete=models.CASCADE) + snipt = models.ForeignKey(Snipt, on_delete=models.CASCADE) code = models.TextField() diff = models.TextField() @@ -330,8 +330,8 @@ class SniptLogEntry(models.Model): class SniptSecureView(models.Model): """A single view to a secure snippet.""" - user = models.ForeignKey(User, on_delete=models.DO_NOTHING) - snipt = models.ForeignKey(Snipt, on_delete=models.DO_NOTHING) + user = models.ForeignKey(User, on_delete=models.CASCADE) + snipt = models.ForeignKey(Snipt, on_delete=models.CASCADE) created = models.DateTimeField(auto_now_add=True, editable=False) modified = models.DateTimeField(auto_now=True, editable=False) @@ -342,8 +342,8 @@ class SniptSecureView(models.Model): class Favorite(models.Model): - snipt = models.ForeignKey(Snipt, on_delete=models.DO_NOTHING) - user = models.ForeignKey(User, on_delete=models.DO_NOTHING) + snipt = models.ForeignKey(Snipt, on_delete=models.CASCADE) + user = models.ForeignKey(User, on_delete=models.CASCADE) created = models.DateTimeField(auto_now_add=True, editable=False) modified = models.DateTimeField(auto_now=True, editable=False) diff --git a/snipts/templates/snipts/snipt-list.html b/snipts/templates/snipts/snipt-list.html index 4d73a65..4526f34 100644 --- a/snipts/templates/snipts/snipt-list.html +++ b/snipts/templates/snipts/snipt-list.html @@ -206,6 +206,11 @@ / API {% endif %} + {% if snipt.user != request.user %} +
  • + Report Spam +
  • + {% endif %} {% if detail and snipt.public %}
  • Tweet diff --git a/snipts/urls.py b/snipts/urls.py index b58d89d..23d4096 100644 --- a/snipts/urls.py +++ b/snipts/urls.py @@ -23,6 +23,7 @@ urlpatterns = [ url( r"^public/tag/(?P[^/]+)/$", views.list_public, name="list-public-tag" ), + url(r'^report-spam/(?P[^/]+)/$', views.report_spam, name='report-spam'), url(r"^download/(?P[^/]+).*$", views.download, name="download"), url(r"^embed/(?P[^/]+)/$", views.embed, name="embed"), url(r"^raw/(?P[^/]+)/(?P[^\?]+)?$", views.raw, name="raw"), diff --git a/snipts/views.py b/snipts/views.py index 1a5158d..c60e3ec 100644 --- a/snipts/views.py +++ b/snipts/views.py @@ -388,3 +388,18 @@ def redirect_user_feed(request, username): def redirect_user_tag_feed(request, username, tag_slug): return HttpResponseRedirect(u"/{}/tag/{}/?rss".format(username, tag_slug)) + +def report_spam(request, snipt_id): + snipt = get_object_or_404(Snipt, pk=snipt_id) + + send_mail('[Snipt] Spam reported', + """ + Snipt: https://snippets.siftie.com/admin/snipts/snipt/{}/ + User: https://snippets.siftie.com/admin/auth/user/{}/delete/ + """.format(snipt.id, snipt.user.id), + 'team@siftie.com', + ['nick@siftie.com'], + fail_silently=False) + + return HttpResponse("""Thanks! Your report has been + submitted to the site admins.""") diff --git a/teams/models.py b/teams/models.py index d675e08..4c7d902 100644 --- a/teams/models.py +++ b/teams/models.py @@ -19,11 +19,11 @@ class Team(models.Model): email = models.EmailField(max_length=255) members = models.ManyToManyField(User, related_name="member", blank=True) name = models.CharField(max_length=30) - owner = models.ForeignKey(User, related_name="owner", on_delete=models.DO_NOTHING) + owner = models.ForeignKey(User, related_name="owner", on_delete=models.CASCADE) slug = models.SlugField(max_length=255, blank=True) stripe_id = models.CharField(max_length=100, null=True, blank=True) user = models.OneToOneField( - User, blank=True, null=True, on_delete=models.DO_NOTHING + User, blank=True, null=True, on_delete=models.CASCADE ) plan = models.CharField( max_length=100, diff --git a/templates/homepage.html b/templates/homepage.html index 160981e..0a70806 100644 --- a/templates/homepage.html +++ b/templates/homepage.html @@ -26,15 +26,12 @@
      {% if request.user.is_authenticated %}
    • - My snippets + My snipts
    • {% endif %}
    • - Public snippets + Public snipts
    • - - - {% if not request.user.is_authenticated %}
    • Log in @@ -57,14 +54,60 @@
      -

      This is a private instance of Siftie Snippets.

      +

      {{ users_count|intcomma }} coders in over 120 countries have stored {{ snipts_count|intcomma }} snipts, in 145 languages.

      {% if request.user.is_authenticated %} - My snippets + My snipts {% else %} - Log in + Sign up {% endif %} +
      +
      + {% for coder in coders %} + + {{ coder.username }} + + {% endfor %} +
      +
      + +
      +
      +
      +
      +

      For teams or individuals

      +
      +
      + +
      +
      +

      Personal accounts

      +

      + Individuals can post public and private snippets, making them perfect + for storing and organizing code you never want to forget. +

      +
      +
      +
      +
      +

      Code-focused blogs

      +

      + A full blog in seconds: mark a snipt as "Blog Post", and it'll + appear on {your-username}.snipt.net. Markdown support built-in. Your domain, or ours. +

      +
      +
      +
      {% endblock %} diff --git a/views.py b/views.py index baa8338..565c4a9 100644 --- a/views.py +++ b/views.py @@ -1,18 +1,45 @@ +import hashlib + +from accounts.models import UserProfile from annoying.decorators import ajax_request, render_to from blogs.views import blog_list +from django.contrib.auth.models import User from django.db.models import Count from django.http import HttpResponseRedirect, HttpResponseBadRequest +from snipts.models import Snipt from snipts.utils import get_lexers_list from taggit.models import Tag -@render_to("homepage.html") +@render_to('homepage.html') def homepage(request): if request.blog_user: return blog_list(request) - return {} + coders = [] + + users_with_gravatars = User.objects.filter( + userprofile__in=UserProfile.objects.filter(has_gravatar=True) + ).order_by('?') + + for user in users_with_gravatars: + public_snipts_count = Snipt.objects.filter( + user=user, public=True).values('pk').count() + + if public_snipts_count: + user.email_md5 = hashlib.md5(user.email.lower().encode('utf-8')) \ + .hexdigest() + coders.append(user) + + if len(coders) == 35: + break + + return { + 'coders': coders, + 'snipts_count': Snipt.objects.all().count(), + 'users_count': User.objects.all().count(), + } @ajax_request