Jobs.
parent
4f4f03880e
commit
21a825f10a
|
@ -0,0 +1,8 @@
|
||||||
|
from django.contrib import admin
|
||||||
|
from jobs.models import Job
|
||||||
|
|
||||||
|
|
||||||
|
class JobAdmin(admin.ModelAdmin):
|
||||||
|
list_display = ('title', 'company', 'location', 'url',)
|
||||||
|
|
||||||
|
admin.site.register(Job, JobAdmin)
|
|
@ -0,0 +1,42 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
import datetime
|
||||||
|
from south.db import db
|
||||||
|
from south.v2 import SchemaMigration
|
||||||
|
from django.db import models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(SchemaMigration):
|
||||||
|
|
||||||
|
def forwards(self, orm):
|
||||||
|
# Adding model 'Job'
|
||||||
|
db.create_table(u'jobs_job', (
|
||||||
|
(u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
|
||||||
|
('title', self.gf('django.db.models.fields.CharField')(max_length=255)),
|
||||||
|
('company', self.gf('django.db.models.fields.CharField')(max_length=255)),
|
||||||
|
('location', self.gf('django.db.models.fields.CharField')(max_length=255)),
|
||||||
|
('url', self.gf('django.db.models.fields.CharField')(max_length=255)),
|
||||||
|
('created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
|
||||||
|
('modified', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)),
|
||||||
|
))
|
||||||
|
db.send_create_signal(u'jobs', ['Job'])
|
||||||
|
|
||||||
|
|
||||||
|
def backwards(self, orm):
|
||||||
|
# Deleting model 'Job'
|
||||||
|
db.delete_table(u'jobs_job')
|
||||||
|
|
||||||
|
|
||||||
|
models = {
|
||||||
|
u'jobs.job': {
|
||||||
|
'Meta': {'object_name': 'Job'},
|
||||||
|
'company': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
|
||||||
|
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
|
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'location': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
|
||||||
|
'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
|
||||||
|
'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
|
||||||
|
'url': ('django.db.models.fields.CharField', [], {'max_length': '255'})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
complete_apps = ['jobs']
|
|
@ -0,0 +1,16 @@
|
||||||
|
from django.db import models
|
||||||
|
|
||||||
|
|
||||||
|
class Job(models.Model):
|
||||||
|
"""An individual Job."""
|
||||||
|
|
||||||
|
title = models.CharField(max_length=255)
|
||||||
|
company = models.CharField(max_length=255)
|
||||||
|
location = models.CharField(max_length=255)
|
||||||
|
url = models.CharField(max_length=255)
|
||||||
|
|
||||||
|
created = models.DateTimeField(auto_now_add=True, editable=False)
|
||||||
|
modified = models.DateTimeField(auto_now=True, editable=False)
|
||||||
|
|
||||||
|
def __unicode__(self):
|
||||||
|
return self.title
|
|
@ -0,0 +1,31 @@
|
||||||
|
{% extends "base.html" %}
|
||||||
|
|
||||||
|
{% load pagination_tags %}
|
||||||
|
|
||||||
|
{% block page-title %}Snipt Jobs{% endblock %}
|
||||||
|
|
||||||
|
{% block body-class %}{{ block.super }} static jobs{% endblock %}
|
||||||
|
|
||||||
|
{% block breadcrumb %}
|
||||||
|
<li><a href="/jobs/">Snipt Jobs</a></li>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<section class="jobs">
|
||||||
|
<ul>
|
||||||
|
{% for job in jobs %}
|
||||||
|
<li>
|
||||||
|
<a href="{{ job.url }}" class="group">
|
||||||
|
<span class="left">
|
||||||
|
<span class="job">{{ job.title }}</span>
|
||||||
|
<span class="company">{{ job.company }}</span>
|
||||||
|
</span>
|
||||||
|
<span class="right">
|
||||||
|
<span class="location">{{ job.location }}</span>
|
||||||
|
</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
{% endblock %}
|
|
@ -0,0 +1,16 @@
|
||||||
|
"""
|
||||||
|
This file demonstrates writing tests using the unittest module. These will pass
|
||||||
|
when you run "manage.py test".
|
||||||
|
|
||||||
|
Replace this with more appropriate tests for your application.
|
||||||
|
"""
|
||||||
|
|
||||||
|
from django.test import TestCase
|
||||||
|
|
||||||
|
|
||||||
|
class SimpleTest(TestCase):
|
||||||
|
def test_basic_addition(self):
|
||||||
|
"""
|
||||||
|
Tests that 1 + 1 always equals 2.
|
||||||
|
"""
|
||||||
|
self.assertEqual(1 + 1, 2)
|
|
@ -0,0 +1,9 @@
|
||||||
|
from annoying.decorators import render_to
|
||||||
|
from jobs.models import Job
|
||||||
|
|
||||||
|
|
||||||
|
@render_to('jobs/jobs.html')
|
||||||
|
def jobs(request):
|
||||||
|
return {
|
||||||
|
'jobs': Job.objects.all().order_by('-created')
|
||||||
|
}
|
|
@ -103,6 +103,7 @@ INSTALLED_APPS = (
|
||||||
|
|
||||||
'accounts',
|
'accounts',
|
||||||
'blogs',
|
'blogs',
|
||||||
|
'jobs',
|
||||||
'snipts',
|
'snipts',
|
||||||
'utils',
|
'utils',
|
||||||
)
|
)
|
||||||
|
|
|
@ -112,6 +112,9 @@
|
||||||
</button>
|
</button>
|
||||||
</li>
|
</li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
<li>
|
||||||
|
<a href="/jobs/" {% if '/jobs/' in request.path %} class="active"{% endif %}>Jobs</a>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
{% if request.user.is_authenticated %}
|
{% if request.user.is_authenticated %}
|
||||||
|
|
|
@ -35,6 +35,9 @@
|
||||||
<li>
|
<li>
|
||||||
<a href="/search/">Search</a>
|
<a href="/search/">Search</a>
|
||||||
</li>
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="/jobs/">Jobs</a>
|
||||||
|
</li>
|
||||||
{% if not request.user.is_authenticated %}
|
{% if not request.user.is_authenticated %}
|
||||||
<li>
|
<li>
|
||||||
<a class="button" href="/login/">Log in</a>
|
<a class="button" href="/login/">Log in</a>
|
||||||
|
|
|
@ -1,118 +0,0 @@
|
||||||
{% extends "base.html" %}
|
|
||||||
|
|
||||||
{% load pagination_tags %}
|
|
||||||
|
|
||||||
{% block page-title %}Snipt Jobs{% endblock %}
|
|
||||||
|
|
||||||
{% block body-class %}{{ block.super }} static jobs{% endblock %}
|
|
||||||
|
|
||||||
{% block breadcrumb %}
|
|
||||||
<li><a href="/jobs/">Snipt Jobs</a></li>
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
<section class="jobs">
|
|
||||||
<h4>New (7)</h4>
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<a href="#" class="group">
|
|
||||||
<span class="left">
|
|
||||||
<span class="job">Visual Designer</span>
|
|
||||||
<span class="company">Acto A/S</span>
|
|
||||||
</span>
|
|
||||||
<span class="right">
|
|
||||||
<span class="location">Dallas, TX, USA</span>
|
|
||||||
<span class="date">Oct 15, 2012</span>
|
|
||||||
</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="#" class="group">
|
|
||||||
<span class="left">
|
|
||||||
<span class="job">Visual Designer</span>
|
|
||||||
<span class="company">Acto A/S</span>
|
|
||||||
</span>
|
|
||||||
<span class="right">
|
|
||||||
<span class="location">Dallas, TX, USA</span>
|
|
||||||
<span class="date">Oct 15, 2012</span>
|
|
||||||
</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="#" class="group">
|
|
||||||
<span class="left">
|
|
||||||
<span class="job">Visual Designer</span>
|
|
||||||
<span class="company">Acto A/S</span>
|
|
||||||
</span>
|
|
||||||
<span class="right">
|
|
||||||
<span class="location">Dallas, TX, USA</span>
|
|
||||||
<span class="date">Oct 15, 2012</span>
|
|
||||||
</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
<h4>Past week (27)</h4>
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<a href="#" class="group">
|
|
||||||
<span class="left">
|
|
||||||
<span class="job">Visual Designer</span>
|
|
||||||
<span class="company">Acto A/S</span>
|
|
||||||
</span>
|
|
||||||
<span class="right">
|
|
||||||
<span class="location">Dallas, TX, USA</span>
|
|
||||||
<span class="date">Oct 15, 2012</span>
|
|
||||||
</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="#" class="group">
|
|
||||||
<span class="left">
|
|
||||||
<span class="job">Visual Designer</span>
|
|
||||||
<span class="company">Acto A/S</span>
|
|
||||||
</span>
|
|
||||||
<span class="right">
|
|
||||||
<span class="location">Dallas, TX, USA</span>
|
|
||||||
<span class="date">Oct 15, 2012</span>
|
|
||||||
</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="#" class="group">
|
|
||||||
<span class="left">
|
|
||||||
<span class="job">Visual Designer</span>
|
|
||||||
<span class="company">Acto A/S</span>
|
|
||||||
</span>
|
|
||||||
<span class="right">
|
|
||||||
<span class="location">Dallas, TX, USA</span>
|
|
||||||
<span class="date">Oct 15, 2012</span>
|
|
||||||
</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="#" class="group">
|
|
||||||
<span class="left">
|
|
||||||
<span class="job">Visual Designer</span>
|
|
||||||
<span class="company">Acto A/S</span>
|
|
||||||
</span>
|
|
||||||
<span class="right">
|
|
||||||
<span class="location">Dallas, TX, USA</span>
|
|
||||||
<span class="date">Oct 15, 2012</span>
|
|
||||||
</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="#" class="group">
|
|
||||||
<span class="left">
|
|
||||||
<span class="job">Visual Designer</span>
|
|
||||||
<span class="company">Acto A/S</span>
|
|
||||||
</span>
|
|
||||||
<span class="right">
|
|
||||||
<span class="location">Dallas, TX, USA</span>
|
|
||||||
<span class="date">Oct 15, 2012</span>
|
|
||||||
</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</section>
|
|
||||||
{% endblock %}
|
|
11
urls.py
11
urls.py
|
@ -5,13 +5,15 @@ from django.views.generic import TemplateView
|
||||||
from django.http import HttpResponseRedirect
|
from django.http import HttpResponseRedirect
|
||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
from snipts.api import (PublicSniptResource, PublicTagResource,
|
from snipts.api import (PublicSniptResource, PublicTagResource,
|
||||||
PublicUserResource, PrivateSniptResource,
|
PublicUserResource, PrivateSniptResource,
|
||||||
PrivateFavoriteResource, PrivateUserProfileResource,
|
PrivateFavoriteResource, PrivateUserProfileResource,
|
||||||
PrivateTagResource, PrivateUserResource)
|
PrivateTagResource, PrivateUserResource)
|
||||||
from snipts.views import search
|
from snipts.views import search
|
||||||
from tastypie.api import Api
|
from tastypie.api import Api
|
||||||
from utils.views import SniptRegistrationView
|
from utils.views import SniptRegistrationView
|
||||||
from views import (homepage, lexers, login_redirect, pro_signup, sitemap, tags, pro_signup_complete)
|
from jobs.views import jobs
|
||||||
|
from views import (homepage, lexers, login_redirect, pro_signup, sitemap, tags,
|
||||||
|
pro_signup_complete)
|
||||||
|
|
||||||
import admin as custom_admin
|
import admin as custom_admin
|
||||||
import os
|
import os
|
||||||
|
@ -45,6 +47,7 @@ urlpatterns = patterns('',
|
||||||
url(r'^humans.txt$', TemplateView.as_view(template_name='humans.txt')),
|
url(r'^humans.txt$', TemplateView.as_view(template_name='humans.txt')),
|
||||||
url(r'^sitemap.xml$', sitemap),
|
url(r'^sitemap.xml$', sitemap),
|
||||||
url(r'^tags/$', tags),
|
url(r'^tags/$', tags),
|
||||||
|
url(r'^jobs/$', jobs),
|
||||||
|
|
||||||
url(r'^pro/$', TemplateView.as_view(template_name='pro.html')),
|
url(r'^pro/$', TemplateView.as_view(template_name='pro.html')),
|
||||||
url(r'^pro/signup/$', pro_signup),
|
url(r'^pro/signup/$', pro_signup),
|
||||||
|
|
30
views.py
30
views.py
|
@ -11,10 +11,12 @@ from django.db.models import Count
|
||||||
from snipts.models import Snipt
|
from snipts.models import Snipt
|
||||||
from taggit.models import Tag
|
from taggit.models import Tag
|
||||||
|
|
||||||
import hashlib, stripe
|
import hashlib
|
||||||
|
import stripe
|
||||||
|
|
||||||
from settings_local import STRIPE_SECRET_KEY
|
from settings_local import STRIPE_SECRET_KEY
|
||||||
|
|
||||||
|
|
||||||
@render_to('homepage.html')
|
@render_to('homepage.html')
|
||||||
def homepage(request):
|
def homepage(request):
|
||||||
|
|
||||||
|
@ -28,7 +30,8 @@ def homepage(request):
|
||||||
).order_by('?')
|
).order_by('?')
|
||||||
|
|
||||||
for user in users_with_gravatars:
|
for user in users_with_gravatars:
|
||||||
public_snipts_count = Snipt.objects.filter(user=user, public=True).values('pk').count()
|
public_snipts_count = Snipt.objects.filter(
|
||||||
|
user=user, public=True).values('pk').count()
|
||||||
|
|
||||||
if public_snipts_count:
|
if public_snipts_count:
|
||||||
user.email_md5 = hashlib.md5(user.email.lower()).hexdigest()
|
user.email_md5 = hashlib.md5(user.email.lower()).hexdigest()
|
||||||
|
@ -43,6 +46,7 @@ def homepage(request):
|
||||||
'users_count': User.objects.all().count(),
|
'users_count': User.objects.all().count(),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ajax_request
|
@ajax_request
|
||||||
def lexers(request):
|
def lexers(request):
|
||||||
lexers = get_lexers_list()
|
lexers = get_lexers_list()
|
||||||
|
@ -69,12 +73,14 @@ def lexers(request):
|
||||||
|
|
||||||
return {'objects': objects}
|
return {'objects': objects}
|
||||||
|
|
||||||
|
|
||||||
def login_redirect(request):
|
def login_redirect(request):
|
||||||
if request.user.is_authenticated():
|
if request.user.is_authenticated():
|
||||||
return HttpResponseRedirect('/' + request.user.username + '/')
|
return HttpResponseRedirect('/' + request.user.username + '/')
|
||||||
else:
|
else:
|
||||||
return HttpResponseRedirect('/')
|
return HttpResponseRedirect('/')
|
||||||
|
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
@render_to('pro-signup.html')
|
@render_to('pro-signup.html')
|
||||||
def pro_signup(request):
|
def pro_signup(request):
|
||||||
|
@ -82,6 +88,7 @@ def pro_signup(request):
|
||||||
return HttpResponseRedirect('/' + request.user.username + '/')
|
return HttpResponseRedirect('/' + request.user.username + '/')
|
||||||
return {}
|
return {}
|
||||||
|
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
@render_to('pro-signup-complete.html')
|
@render_to('pro-signup-complete.html')
|
||||||
def pro_signup_complete(request):
|
def pro_signup_complete(request):
|
||||||
|
@ -93,11 +100,9 @@ def pro_signup_complete(request):
|
||||||
|
|
||||||
plan = 'snipt-pro-monthly'
|
plan = 'snipt-pro-monthly'
|
||||||
|
|
||||||
customer = stripe.Customer.create(
|
customer = stripe.Customer.create(card=token,
|
||||||
card = token,
|
plan=plan,
|
||||||
plan = plan,
|
email=request.user.email)
|
||||||
email = request.user.email
|
|
||||||
)
|
|
||||||
|
|
||||||
profile = request.user.profile
|
profile = request.user.profile
|
||||||
profile.is_pro = True
|
profile.is_pro = True
|
||||||
|
@ -109,6 +114,7 @@ def pro_signup_complete(request):
|
||||||
else:
|
else:
|
||||||
return HttpResponseBadRequest()
|
return HttpResponseBadRequest()
|
||||||
|
|
||||||
|
|
||||||
def sitemap(request):
|
def sitemap(request):
|
||||||
|
|
||||||
tags = Tag.objects.filter(snipt__public=True)
|
tags = Tag.objects.filter(snipt__public=True)
|
||||||
|
@ -116,9 +122,10 @@ def sitemap(request):
|
||||||
tags = tags.order_by('-count')[:1000]
|
tags = tags.order_by('-count')[:1000]
|
||||||
|
|
||||||
return render_to_response('sitemap.xml',
|
return render_to_response('sitemap.xml',
|
||||||
{'tags': tags},
|
{'tags': tags},
|
||||||
context_instance=RequestContext(request),
|
context_instance=RequestContext(request),
|
||||||
mimetype='application/xml')
|
mimetype='application/xml')
|
||||||
|
|
||||||
|
|
||||||
@render_to('tags.html')
|
@render_to('tags.html')
|
||||||
def tags(request):
|
def tags(request):
|
||||||
|
@ -127,7 +134,8 @@ def tags(request):
|
||||||
all_tags = all_tags.annotate(count=Count('taggit_taggeditem_items__id'))
|
all_tags = all_tags.annotate(count=Count('taggit_taggeditem_items__id'))
|
||||||
|
|
||||||
popular_tags = Tag.objects.filter(snipt__public=True)
|
popular_tags = Tag.objects.filter(snipt__public=True)
|
||||||
popular_tags = popular_tags.annotate(count=Count('taggit_taggeditem_items__id'))
|
popular_tags = popular_tags.annotate(
|
||||||
|
count=Count('taggit_taggeditem_items__id'))
|
||||||
popular_tags = popular_tags.order_by('-count')[:20]
|
popular_tags = popular_tags.order_by('-count')[:20]
|
||||||
popular_tags = sorted(popular_tags, key=lambda tag: tag.name)
|
popular_tags = sorted(popular_tags, key=lambda tag: tag.name)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue