diff --git a/karinacms/lead_center/__init__.py b/karinacms/dev_center/__init__.py similarity index 100% rename from karinacms/lead_center/__init__.py rename to karinacms/dev_center/__init__.py diff --git a/karinacms/lead_center/admin.py b/karinacms/dev_center/admin.py similarity index 56% rename from karinacms/lead_center/admin.py rename to karinacms/dev_center/admin.py index d31b722..dcc4223 100644 --- a/karinacms/lead_center/admin.py +++ b/karinacms/dev_center/admin.py @@ -1,6 +1,6 @@ from django.contrib import admin -from lead_center.models import Campaign, Lead +from dev_center.models import Campaign, Dev admin.site.register(Campaign); -admin.site.register(Lead); +admin.site.register(Dev); # Register your models here. diff --git a/karinacms/lead_center/custom_permissions.py b/karinacms/dev_center/custom_permissions.py similarity index 100% rename from karinacms/lead_center/custom_permissions.py rename to karinacms/dev_center/custom_permissions.py diff --git a/karinacms/lead_center/forms.py b/karinacms/dev_center/forms.py similarity index 79% rename from karinacms/lead_center/forms.py rename to karinacms/dev_center/forms.py index 84376dd..169e531 100644 --- a/karinacms/lead_center/forms.py +++ b/karinacms/dev_center/forms.py @@ -1,6 +1,6 @@ from django import forms from django.contrib.auth.models import User -from .models import Lead, Campaign, LeadComment, LeadStatus, UserInfo, Product +from .models import Dev, Campaign, DevComment, DevStatus, UserInfo, Product class BootstrapForm(forms.ModelForm): def __init__(self, *args, **kwargs): @@ -31,9 +31,9 @@ class Meta: model = Campaign fields = ('name', 'description',) -class LeadStatusForm(BootstrapForm): +class DevStatusForm(BootstrapForm): class Meta: - model = LeadStatus + model = DevStatus fields = ('name', 'description',) class UserLoginForm(BootstrapForm): @@ -43,22 +43,23 @@ class Meta: model = User fields = ('username', 'password',) -class LeadForm(BootstrapForm): +class DevForm(BootstrapForm): class Meta: - model = Lead + model = Dev fields = ('first_name', 'last_name', 'city', 'phone', - 'email', 'comment', 'status', 'campaign', 'product') + 'email', 'comment', 'status', 'campaign', 'product', + 'asana', 'github', 'slack') -class leadCommentForm(BootstrapForm): +class DevCommentForm(BootstrapForm): title = forms.CharField(max_length=512, help_text="Summary of the call") comment = forms.CharField(max_length=1024, widget=forms.Textarea, help_text="Description of the call") def __init__(self, *args, **kwargs): - super(leadCommentForm, self).__init__(*args, **kwargs) + super(DevCommentForm, self).__init__(*args, **kwargs) self.fields['title'].widget.attrs['class'] = 'form-control' self.fields['comment'].widget.attrs['class'] = 'form-control' class Meta: - model = LeadComment + model = DevComment fields = ('title', 'comment',) diff --git a/karinacms/lead_center/migrations/0001_initial.py b/karinacms/dev_center/migrations/0001_initial.py similarity index 74% rename from karinacms/lead_center/migrations/0001_initial.py rename to karinacms/dev_center/migrations/0001_initial.py index 140dedf..c07430c 100644 --- a/karinacms/lead_center/migrations/0001_initial.py +++ b/karinacms/dev_center/migrations/0001_initial.py @@ -9,86 +9,89 @@ class Migration(SchemaMigration): def forwards(self, orm): # Adding model 'UserInfo' - db.create_table(u'lead_center_userinfo', ( + db.create_table(u'dev_center_userinfo', ( (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), ('user', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['auth.User'], unique=True)), ('site', self.gf('django.db.models.fields.URLField')(max_length=200, blank=True)), )) - db.send_create_signal(u'lead_center', ['UserInfo']) + db.send_create_signal(u'dev_center', ['UserInfo']) # Adding model 'Campaign' - db.create_table(u'lead_center_campaign', ( + db.create_table(u'dev_center_campaign', ( (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), ('name', self.gf('django.db.models.fields.CharField')(max_length=255)), ('description', self.gf('django.db.models.fields.CharField')(max_length=512, blank=True)), ('view', self.gf('django.db.models.fields.CharField')(max_length=50, blank=True)), )) - db.send_create_signal(u'lead_center', ['Campaign']) + db.send_create_signal(u'dev_center', ['Campaign']) # Adding model 'Product' - db.create_table(u'lead_center_product', ( + db.create_table(u'dev_center_product', ( (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), ('name', self.gf('django.db.models.fields.CharField')(max_length=255)), ('description', self.gf('django.db.models.fields.CharField')(max_length=512, blank=True)), )) - db.send_create_signal(u'lead_center', ['Product']) + db.send_create_signal(u'dev_center', ['Product']) - # Adding model 'LeadStatus' - db.create_table(u'lead_center_leadstatus', ( + # Adding model 'DevStatus' + db.create_table(u'dev_center_devstatus', ( (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), ('name', self.gf('django.db.models.fields.CharField')(max_length=255)), ('description', self.gf('django.db.models.fields.CharField')(max_length=512, blank=True)), )) - db.send_create_signal(u'lead_center', ['LeadStatus']) + db.send_create_signal(u'dev_center', ['DevStatus']) - # Adding model 'Lead' - db.create_table(u'lead_center_lead', ( + # Adding model 'Dev' + db.create_table(u'dev_center_dev', ( (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('campaign', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['lead_center.Campaign'], null=True)), - ('product', self.gf('django.db.models.fields.related.ForeignKey')(related_name='product_leads', null=True, to=orm['lead_center.Product'])), - ('status', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['lead_center.LeadStatus'], null=True)), - ('campaign_url', self.gf('django.db.models.fields.CharField')(max_length=100, null=True)), + ('campaign', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='campaign_devs', null=True, to=orm['dev_center.Campaign'])), + ('product', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='product_devs', null=True, to=orm['dev_center.Product'])), + ('status', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='status_devs', null=True, to=orm['dev_center.DevStatus'])), + ('campaign_url', self.gf('django.db.models.fields.CharField')(max_length=100, blank=True)), ('phone', self.gf('django.db.models.fields.CharField')(max_length=15)), ('email', self.gf('django.db.models.fields.CharField')(max_length=60, blank=True)), + ('asana', self.gf('django.db.models.fields.CharField')(max_length=60, blank=True)), + ('github', self.gf('django.db.models.fields.CharField')(max_length=60, blank=True)), + ('slack', self.gf('django.db.models.fields.CharField')(max_length=60, blank=True)), ('first_name', self.gf('django.db.models.fields.CharField')(max_length=40)), ('last_name', self.gf('django.db.models.fields.CharField')(max_length=40)), - ('city', self.gf('django.db.models.fields.CharField')(max_length=50, null=True)), + ('city', self.gf('django.db.models.fields.CharField')(max_length=50, blank=True)), ('comment', self.gf('django.db.models.fields.CharField')(max_length=255, blank=True)), - ('ip', self.gf('django.db.models.fields.CharField')(max_length=30, null=True)), - ('agent', self.gf('django.db.models.fields.CharField')(max_length=60, null=True)), + ('ip', self.gf('django.db.models.fields.CharField')(max_length=30, blank=True)), + ('agent', self.gf('django.db.models.fields.CharField')(max_length=60, blank=True)), )) - db.send_create_signal(u'lead_center', ['Lead']) + db.send_create_signal(u'dev_center', ['Dev']) - # Adding model 'LeadComment' - db.create_table(u'lead_center_leadcomment', ( + # Adding model 'DevComment' + db.create_table(u'dev_center_devcomment', ( (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('lead', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['lead_center.Lead'])), + ('dev', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['dev_center.Dev'])), ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])), ('title', self.gf('django.db.models.fields.CharField')(max_length=512)), ('comment', self.gf('django.db.models.fields.TextField')(max_length=1024)), ('time', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)), )) - db.send_create_signal(u'lead_center', ['LeadComment']) + db.send_create_signal(u'dev_center', ['DevComment']) def backwards(self, orm): # Deleting model 'UserInfo' - db.delete_table(u'lead_center_userinfo') + db.delete_table(u'dev_center_userinfo') # Deleting model 'Campaign' - db.delete_table(u'lead_center_campaign') + db.delete_table(u'dev_center_campaign') # Deleting model 'Product' - db.delete_table(u'lead_center_product') + db.delete_table(u'dev_center_product') - # Deleting model 'LeadStatus' - db.delete_table(u'lead_center_leadstatus') + # Deleting model 'DevStatus' + db.delete_table(u'dev_center_devstatus') - # Deleting model 'Lead' - db.delete_table(u'lead_center_lead') + # Deleting model 'Dev' + db.delete_table(u'dev_center_dev') - # Deleting model 'LeadComment' - db.delete_table(u'lead_center_leadcomment') + # Deleting model 'DevComment' + db.delete_table(u'dev_center_devcomment') models = { @@ -128,51 +131,54 @@ def backwards(self, orm): 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) }, - u'lead_center.campaign': { + u'dev_center.campaign': { 'Meta': {'object_name': 'Campaign'}, 'description': ('django.db.models.fields.CharField', [], {'max_length': '512', 'blank': 'True'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), 'view': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}) }, - u'lead_center.lead': { - 'Meta': {'object_name': 'Lead'}, - 'agent': ('django.db.models.fields.CharField', [], {'max_length': '60', 'null': 'True'}), - 'campaign': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['lead_center.Campaign']", 'null': 'True'}), - 'campaign_url': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True'}), - 'city': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True'}), + u'dev_center.dev': { + 'Meta': {'object_name': 'Dev'}, + 'agent': ('django.db.models.fields.CharField', [], {'max_length': '60', 'blank': 'True'}), + 'asana': ('django.db.models.fields.CharField', [], {'max_length': '60', 'blank': 'True'}), + 'campaign': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'campaign_devs'", 'null': 'True', 'to': u"orm['dev_center.Campaign']"}), + 'campaign_url': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), + 'city': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}), 'comment': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), 'email': ('django.db.models.fields.CharField', [], {'max_length': '60', 'blank': 'True'}), 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '40'}), + 'github': ('django.db.models.fields.CharField', [], {'max_length': '60', 'blank': 'True'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'ip': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True'}), + 'ip': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '40'}), 'phone': ('django.db.models.fields.CharField', [], {'max_length': '15'}), - 'product': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'product_leads'", 'null': 'True', 'to': u"orm['lead_center.Product']"}), - 'status': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['lead_center.LeadStatus']", 'null': 'True'}) + 'product': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'product_devs'", 'null': 'True', 'to': u"orm['dev_center.Product']"}), + 'slack': ('django.db.models.fields.CharField', [], {'max_length': '60', 'blank': 'True'}), + 'status': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'status_devs'", 'null': 'True', 'to': u"orm['dev_center.DevStatus']"}) }, - u'lead_center.leadcomment': { - 'Meta': {'object_name': 'LeadComment'}, + u'dev_center.devcomment': { + 'Meta': {'object_name': 'DevComment'}, 'comment': ('django.db.models.fields.TextField', [], {'max_length': '1024'}), + 'dev': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['dev_center.Dev']"}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'lead': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['lead_center.Lead']"}), 'time': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), 'title': ('django.db.models.fields.CharField', [], {'max_length': '512'}), 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}) }, - u'lead_center.leadstatus': { - 'Meta': {'object_name': 'LeadStatus'}, + u'dev_center.devstatus': { + 'Meta': {'object_name': 'DevStatus'}, 'description': ('django.db.models.fields.CharField', [], {'max_length': '512', 'blank': 'True'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}) }, - u'lead_center.product': { + u'dev_center.product': { 'Meta': {'object_name': 'Product'}, 'description': ('django.db.models.fields.CharField', [], {'max_length': '512', 'blank': 'True'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}) }, - u'lead_center.userinfo': { + u'dev_center.userinfo': { 'Meta': {'object_name': 'UserInfo'}, u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'site': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), @@ -180,4 +186,4 @@ def backwards(self, orm): } } - complete_apps = ['lead_center'] \ No newline at end of file + complete_apps = ['dev_center'] \ No newline at end of file diff --git a/karinacms/lead_center/migrations/__init__.py b/karinacms/dev_center/migrations/__init__.py similarity index 100% rename from karinacms/lead_center/migrations/__init__.py rename to karinacms/dev_center/migrations/__init__.py diff --git a/karinacms/lead_center/models.py b/karinacms/dev_center/models.py similarity index 81% rename from karinacms/lead_center/models.py rename to karinacms/dev_center/models.py index 0b3f70c..bdf4efc 100644 --- a/karinacms/lead_center/models.py +++ b/karinacms/dev_center/models.py @@ -22,19 +22,22 @@ class Product(models.Model): def __unicode__(self): return self.name -class LeadStatus(models.Model): +class DevStatus(models.Model): name = models.CharField(max_length=255) description = models.CharField(max_length=512, blank=True) def __unicode__(self): return self.name -class Lead(models.Model): - campaign = models.ForeignKey(Campaign, null=True, blank=True, related_name='campaign_leads') - product = models.ForeignKey(Product, null=True, blank=True, related_name='product_leads') - status = models.ForeignKey(LeadStatus, null=True, blank=True, related_name='status_leads') +class Dev(models.Model): + campaign = models.ForeignKey(Campaign, null=True, blank=True, related_name='campaign_devs') + product = models.ForeignKey(Product, null=True, blank=True, related_name='product_devs') + status = models.ForeignKey(DevStatus, null=True, blank=True, related_name='status_devs') campaign_url = models.CharField(max_length=100, blank=True) phone = models.CharField(max_length=15) email = models.CharField(max_length=60, blank=True) + asana = models.CharField(max_length=60, blank=True) + github = models.CharField(max_length=60, blank=True) + slack = models.CharField(max_length=60, blank=True) first_name = models.CharField(max_length=40) last_name = models.CharField(max_length=40) city = models.CharField(max_length=50, blank=True) @@ -46,8 +49,8 @@ def name(self): def __unicode__(self): return '%s %s' % (self.first_name, self.last_name) -class LeadComment(models.Model): - lead = models.ForeignKey(Lead) +class DevComment(models.Model): + dev = models.ForeignKey(Dev) user = models.ForeignKey(User) title = models.CharField(max_length=512, null=False) comment = models.TextField(max_length=1024, null=False) diff --git a/karinacms/lead_center/serializers.py b/karinacms/dev_center/serializers.py similarity index 50% rename from karinacms/lead_center/serializers.py rename to karinacms/dev_center/serializers.py index 76c2bbe..bbb242f 100644 --- a/karinacms/lead_center/serializers.py +++ b/karinacms/dev_center/serializers.py @@ -1,7 +1,7 @@ -from .models import Lead +from .models import Dev from rest_framework import serializers -class LeadSerializer(serializers.HyperlinkedModelSerializer): +class DevSerializer(serializers.HyperlinkedModelSerializer): class Meta: - model = Lead + model = Dev fields = ('first_name', 'last_name', 'phone',) \ No newline at end of file diff --git a/karinacms/lead_center/templatetags/__init__.py b/karinacms/dev_center/templatetags/__init__.py similarity index 100% rename from karinacms/lead_center/templatetags/__init__.py rename to karinacms/dev_center/templatetags/__init__.py diff --git a/karinacms/lead_center/templatetags/custom_filters.py b/karinacms/dev_center/templatetags/custom_filters.py similarity index 100% rename from karinacms/lead_center/templatetags/custom_filters.py rename to karinacms/dev_center/templatetags/custom_filters.py diff --git a/karinacms/lead_center/tests.py b/karinacms/dev_center/tests.py similarity index 100% rename from karinacms/lead_center/tests.py rename to karinacms/dev_center/tests.py diff --git a/karinacms/dev_center/urls.py b/karinacms/dev_center/urls.py new file mode 100644 index 0000000..a642c5f --- /dev/null +++ b/karinacms/dev_center/urls.py @@ -0,0 +1,23 @@ +from django.conf.urls import patterns, include, url + +from django.contrib import admin +from dev_center import views +admin.autodiscover() + +urlpatterns = patterns('', + url(r'^$', 'dev_center.views.index', name='index'), + # url(r'^about/', 'dev_center.views.about', name='about'), + url(r'^add_dev/(?P.+)?', 'dev_center.views.dev_form', name='add_dev'), + url(r'^edit_dev/(?P\d+)/$', 'dev_center.views.dev_edit_form', name='edit_dev'), + url(r'^dev_page/(?P.+)?', 'dev_center.views.dev_page', name='dev_page'), + url(r'^products/', 'dev_center.views.product_list', name='product_list'), + url(r'^campaigns/', 'dev_center.views.campaign_list', name='campaign_list'), + url(r'^statuses/', 'dev_center.views.status_list', name='status_list'), + # url(r'^blog/', includedev_center('blog.urls')), + url(r'^register/', 'dev_center.views.register', name='register'),#TODO: remove those paths to the root urls.py + url(r'^login/', 'dev_center.views.user_login', name='login'), + url(r'^logout/', 'dev_center.views.user_logout', name='logout'), + url(r'^search_list/$', 'dev_center.views.search_list', name='search_list'), + url(r'^edit/(?P.+)/(?P\d+)$', 'dev_center.views.edit_obj', name='edit_obj'), #url(r'^admin/', include(admin.site.urls)), + url(r'^delete/(?P.+)/(?P\d+)$', 'dev_center.views.delete_obj', name='delete_obj'), +) \ No newline at end of file diff --git a/karinacms/dev_center/views.py b/karinacms/dev_center/views.py new file mode 100644 index 0000000..52225cb --- /dev/null +++ b/karinacms/dev_center/views.py @@ -0,0 +1,352 @@ +from django.shortcuts import render, redirect +from django.contrib.auth import authenticate, login, logout +from django.contrib.auth.decorators import login_required +from django.db.models import Count +from .forms import DevForm, CampaignForm, DevCommentForm, UserForm, UserInfoForm, ProductForm, DevStatusForm +from .models import Campaign, Dev, DevComment, DevStatus, Product +from django.http import HttpResponseRedirect +from datetime import datetime + +from rest_framework import viewsets, permissions +from .serializers import DevSerializer +from .custom_permissions import PostOnly + +from karinacms import settings +import requests +import json + +# import sys +# sys.path.insert(0, '/path/to/application/app/folder') + + +class DevViewSet(viewsets.ModelViewSet): + """ + API endpoint that allows devs being viewed and edited + """ + model = Dev + serializer_class = DevSerializer + permission_classes = [PostOnly] + + +def register(request): + registered = False + userForm = UserForm(request.POST or None) + userInfoForm = UserInfoForm(request.POST or None) + if userForm.is_valid() and userInfoForm.is_valid(): + user = userForm.save() + user.set_password(user.password) + user.save() + userInfo = userInfoForm.save(commit=False) + userInfo.user = user + userInfo.save() + registered = True + + context = {'userForm': userForm, 'userInfoForm': userInfoForm, 'registered': registered} + return render(request, 'dev_center/register.html', context) + + +def user_login(request): + msg = None + next = None + + if request.method == 'POST': + username = request.POST['username']; + password = request.POST['password']; + u = authenticate(username=username, password=password) + if u and u.is_active: + login(request, u) + redirect_url = request.GET.get('next') or '/devs/' + return HttpResponseRedirect(redirect_url) + else: + msg = 'Invalid credentials or inactive account' + # context.form = userCredentialsForm + context = {'msg': msg} + return render(request, 'dev_center/login.html', context) + + +def set_admin_permissions(devData, github, asana): + workspaces = get_asana_workspaces() + send_github_invitation(devData.github) if devData.github != github or devData.status.name != 'inactive' else None + send_asana_invitation(devData.asana, workspaces) if devData.asana != asana or devData.status.name != 'inactive' else None + revoke_github_permissions(devData.github) if devData.status.name == 'inactive' else None + revoke_asana_permissions(devData.asana, workspaces) if devData.status.name == 'inactive' else None + + +def send_github_invitation(user): + # Sends a github invitation to the Team to the selected User. + # User MUST be a username. Can't be an email. + + r = requests.put(settings.API_GITHUB_URL + settings.GIT_MEMBERSHIP + user, + auth=(settings.GIT_USER, settings.GIT_ACCESS_TOKEN)) + return r + + +def revoke_github_permissions(user): + # If the user is set to inactive, permissions to the user are denied + + r = requests.delete(settings.API_GITHUB_URL + settings.GIT_MEMBERSHIP + user, + auth=(settings.GIT_USER, settings.GIT_ACCESS_TOKEN)) + + return r + + +def get_asana_workspaces(): + # Gets all projects available + # Todo: Selectable project invitation. + + work_r = requests.get(settings.API_ASANA_URL + settings.ASANA_WORKSPACES, + headers={'Authorization': 'Bearer %s' % settings.ASANA_ACCESS_TOKEN}) + + work = json.loads(work_r.text) + workspaces = [str(i['id']) for i in work['data']] + + return workspaces + + +def send_asana_invitation(user, workspaces): + # Sends an invitation to each of the available workspaces. + + responses = [] + for i in workspaces: + r = requests.post(settings.API_ASANA_URL + settings.ASANA_WORKSPACES + i + settings.ASANA_ADD_USER, + data={'user': user}, + headers={'Authorization': 'Bearer %s' % settings.ASANA_ACCESS_TOKEN}) + responses.append(r) + + return responses + + +def revoke_asana_permissions(user, workspaces): + # If the user is set to inactive, permissions to the user are denied + + responses = [] + for i in workspaces: + r = requests.post(settings.API_ASANA_URL + settings.ASANA_WORKSPACES + i + settings.ASANA_DELETE_USER, + data={'user': user}, + headers={'Authorization': 'Bearer %s' % settings.ASANA_ACCESS_TOKEN}) + responses.append(r) + + return responses + + + +@login_required +def dev_form(request, campaign_name='eartohear.info'): + campaign = None + try: + campaign = Campaign.objects.get(name=campaign_name) + print campaign + except Campaign.DoesNotExist: + pass # do stuff + + form = DevForm(request.POST or None) + + context_dict = {'form': form, 'title': 'Create new dev'} + if form.is_valid(): + # do stuff + dev = form.save(commit=False) + dev.campaign = campaign + dev.save() + context_dict['success'] = True + git_response = send_github_invitation(dev.github) if dev.github else None + asana_responses = send_asana_invitation(dev.asana) if dev.asana else None + # Todo: Show if exceptions appear/success + + return render(request, 'dev_center/dev_form.html', context_dict) + + +@login_required +def dev_edit_form(request, dev_id): + devData=None + form=None + devEdited=False + notFound=False + title=None + try: + devData = Dev.objects.get(id=dev_id) + except Dev.DoesNotExist: + pass #pass + + if devData: + github = devData.github + asana = devData.asana + title = 'Edit dev - ' + devData.first_name + ' ' + devData.last_name + form = DevForm(request.POST or None, instance=devData) + if form.is_valid(): + #save for and show success + devData.save() + form.save() + devEdited = True + set_admin_permissions(devData, github, asana) + else: + #no such dev + title = 'No such dev' + notFound = True + context_dict = {'title': title, 'notFound': notFound, 'devEdited': devEdited, 'form': form} + return render(request, 'dev_center/dev_form.html', context_dict) + + +@login_required +def product_list(request): + productAdded = False + products = Product.objects.annotate(dev_count=Count('product_devs')) + #products = = Product.objects.all() + + form=ProductForm(request.POST or None) + if form.is_valid(): + product = form.save() + product.save() + productAdded = True + context_dict = {'products': products, 'form': form, 'productAdded': productAdded, 'obj_type': 'Product'} + return render(request, 'dev_center/product_list.html', context_dict) + + +@login_required +def search_list(request): + object_type = request.GET['object_type'] + query_string = request.GET['query_string'] + if object_type == 'Campaign': + model_class = Campaign + objStr = 'campaign' + elif object_type == 'Product': + model_class = Product + objStr = 'product' + elif object_type == 'Status': + model_class = DevStatus + objStr = 'status' + elif object_type == 'Dev': + model_class = Dev + objStr = 'dev' + result_set = model_class.objects.filter(name__icontains=query_string) + return render(request, 'dev_center/common/generic_list.html', {'obj': result_set, 'objStr': objStr}) + + +@login_required +def delete_obj(request, obj_type, obj_id): + if obj_type == 'campaign': + title = 'Delete campagign?' + model_class = Campaign + redirect_url = 'campaign_list' + elif obj_type == 'product': + title = 'Delete product?' + model_class = Product + redirect_url = 'product_list' + elif obj_type == 'status': + title = 'Delete status?' + model_class = DevStatus + redirect_url = 'status_list' + else: + raise Http404 + + success = None + try: + obj = model_class.objects.get(pk=obj_id) + except (Campaign.DoesNotExist, Product.DoesNotExist): + raise Http404 + + if request.method == "POST" and obj: + obj.delete() + return redirect(redirect_url) + + return render(request, 'dev_center/common/delete_obj.html', {'title': delete_obj, 'success': success, 'object': obj}) + + +@login_required +def edit_obj (request, obj_type, obj_id): + if obj_type == 'campaign': + model = Campaign + form_class = CampaignForm + title = 'Edit campaign' + redirect_url = 'campaign_list' + elif obj_type == 'product': + model = Product + form_class = ProductForm + title = 'Edit product' + redirect_url = 'product_list' + elif obj_type == 'status': + model = DevStatus + form_class = DevStatusForm + title = 'Edit dev status' + redirect_url = 'status_list' + else: + raise Http404 + + success = None + try: + obj = model.objects.get(pk=obj_id) + except model.DoesNotExist: + raise Http404 + + form = form_class(request.POST or None, instance=obj) + + if form.is_valid() and obj: + form.save() + return redirect(redirect_url) + return render(request, 'dev_center/common/edit_obj.html', {'title': title, 'formTitle': obj.name, 'form': form}) + + +@login_required +def campaign_list(request): + campaignAdded = False + campaigns = Campaign.objects.annotate(dev_count=Count('campaign_devs')) + #products = = Product.objects.all() + form=CampaignForm(request.POST or None) + if form.is_valid(): + campaign = form.save() + campaignAdded = True + context_dict = {'campaigns': campaigns, 'form': form, 'campaignAdded': campaignAdded, 'obj_type': 'Campaign'} + return render(request, 'dev_center/campaign_list.html', context_dict) + + +@login_required +def status_list(request): + statusAdded = False + statuses = DevStatus.objects.annotate(dev_count=Count('status_devs')) + #products = = Product.objects.all() + form=DevStatusForm(request.POST or None) + if form.is_valid(): + status = form.save() + statusAdded = True + context_dict = {'statuses': statuses, 'form': form, 'statusAdded': statusAdded, 'obj_type': 'Status'} + return render(request, 'dev_center/status_list.html', context_dict) + + +@login_required +def user_logout(request): + logout(request) + return HttpResponseRedirect('/devs/') + +def index(request): + devs = Dev.objects.all().order_by('phone') + context_dict = {'devs': devs} + if request.session.has_key('last_visit'): + last_visit = request.session.get('last_visit') + visits = request.session.get('visits', 0) + if(datetime.now() - datetime.strptime(last_visit[:-7], "%Y-%m-%d %H:%M:%S")).days > 0: + request.session['last_visit'] = str(datetime.now()) + request.session['visits'] = visits + 1 + else: + request.session['last_visit'] = str(datetime.now()) + request.session['visits'] = 1 + return render(request, 'dev_center/index.html', context_dict) + + +@login_required +def dev_page(request, dev_name=None): + split_name = dev_name.split('-') + devs = None + comment_list = None + comment_success = False + + devs = Dev.objects.filter(first_name = split_name[0], last_name = split_name[1]) + + form = DevCommentForm(request.POST or None) + if devs: + comment_list = DevComment.objects.filter(dev = devs[0]) + if devs and form.is_valid(): + comment = form.save(commit=False) + comment.dev = devs[0]#change this to many to many blat + comment.save() + comment_success = True + context_dict = {'devs': devs, 'title': dev_name, 'form': form, 'comment_list': comment_list, 'comment_success': comment_success} + return render(request, 'dev_center/dev_page.html', context_dict) diff --git a/karinacms/karinacms/local_settings.py b/karinacms/karinacms/local_settings.py new file mode 100644 index 0000000..e69de29 diff --git a/karinacms/karinacms/settings.py b/karinacms/karinacms/settings.py index e88f95b..b6059c8 100644 --- a/karinacms/karinacms/settings.py +++ b/karinacms/karinacms/settings.py @@ -15,11 +15,11 @@ PROJECT_PATH = os.path.join(SETTINGS_DIR, os.pardir) PROJECT_PATH = os.path.abspath(PROJECT_PATH) TEMPLATE_PATH = os.path.join(PROJECT_PATH, 'templates') -TEMPLATE_PATH_LEADS = os.path.join(TEMPLATE_PATH, 'lead_center') +TEMPLATE_PATH_LEADS = os.path.join(TEMPLATE_PATH, 'dev_center') TEMPLATE_PATH_LEADS_COMMON = os.path.join(TEMPLATE_PATH_LEADS, 'common') STATIC_PATH = os.path.join(PROJECT_PATH, 'static') STATIC_URL = '/static/' -LOGIN_URL = '/leads/login/' +LOGIN_URL = '/devs/login/' # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/1.6/howto/deployment/checklist/ @@ -44,7 +44,7 @@ 'django.contrib.messages', 'django.contrib.staticfiles', 'south', - 'lead_center', + 'dev_center', 'rest_framework', ) @@ -113,3 +113,21 @@ # https://docs.djangoproject.com/en/1.6/howto/static-files/ STATIC_URL = '/static/' + + +# Github Credentials +API_GITHUB_URL = 'https://api.github.com/' +GIT_MEMBERSHIP = 'orgs/onitsoft/memberships/' +GIT_USER = '' +GIT_ACCESS_TOKEN = '' + +# Asana Credentials +API_ASANA_URL = 'https://app.asana.com/api/1.0/' +ASANA_WORKSPACES = 'workspaces/' +ASANA_ADD_USER = '/addUser/' +ASANA_DELETE_USER = '/removeUser/' + +try: + from local_settings import * +except ImportError: + pass diff --git a/karinacms/karinacms/urls.py b/karinacms/karinacms/urls.py index 84f38a0..a94d82a 100644 --- a/karinacms/karinacms/urls.py +++ b/karinacms/karinacms/urls.py @@ -1,15 +1,15 @@ from django.conf.urls import patterns, include, url -from lead_center import views +from dev_center import views from rest_framework import routers from django.contrib import admin admin.autodiscover() router = routers.DefaultRouter() -router.register(r'leads', views.LeadViewSet) +router.register(r'devs', views.DevViewSet) urlpatterns = patterns('', - url(r'^leads/', include('lead_center.urls')), + url(r'^devs/', include('dev_center.urls')), url(r'^admin/', include(admin.site.urls)), url(r'^api/', include(router.urls)), # url(r'^api/', include('rest_framework.urls', namespace='rest_framework')), diff --git a/karinacms/lead_center/migrations/0002_01.py b/karinacms/lead_center/migrations/0002_01.py deleted file mode 100644 index 2dd4ff4..0000000 --- a/karinacms/lead_center/migrations/0002_01.py +++ /dev/null @@ -1,105 +0,0 @@ -# -*- coding: utf-8 -*- -from south.utils import datetime_utils as datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - - -class Migration(SchemaMigration): - - def forwards(self, orm): - pass - - def backwards(self, orm): - pass - - models = { - u'auth.group': { - 'Meta': {'object_name': 'Group'}, - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - u'auth.permission': { - 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - u'auth.user': { - 'Meta': {'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - u'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - }, - u'lead_center.campaign': { - 'Meta': {'object_name': 'Campaign'}, - 'description': ('django.db.models.fields.CharField', [], {'max_length': '512', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'view': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}) - }, - u'lead_center.lead': { - 'Meta': {'object_name': 'Lead'}, - 'agent': ('django.db.models.fields.CharField', [], {'max_length': '60', 'null': 'True'}), - 'campaign': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['lead_center.Campaign']", 'null': 'True'}), - 'campaign_url': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True'}), - 'city': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True'}), - 'comment': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), - 'email': ('django.db.models.fields.CharField', [], {'max_length': '60', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '40'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'ip': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '40'}), - 'phone': ('django.db.models.fields.CharField', [], {'max_length': '15'}), - 'product': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'product_leads'", 'null': 'True', 'to': u"orm['lead_center.Product']"}), - 'status': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['lead_center.LeadStatus']", 'null': 'True'}) - }, - u'lead_center.leadcomment': { - 'Meta': {'object_name': 'LeadComment'}, - 'comment': ('django.db.models.fields.TextField', [], {'max_length': '1024'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'lead': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['lead_center.Lead']"}), - 'time': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), - 'title': ('django.db.models.fields.CharField', [], {'max_length': '512'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}) - }, - u'lead_center.leadstatus': { - 'Meta': {'object_name': 'LeadStatus'}, - 'description': ('django.db.models.fields.CharField', [], {'max_length': '512', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}) - }, - u'lead_center.product': { - 'Meta': {'object_name': 'Product'}, - 'description': ('django.db.models.fields.CharField', [], {'max_length': '512', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}) - }, - u'lead_center.userinfo': { - 'Meta': {'object_name': 'UserInfo'}, - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'site': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), - 'user': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['auth.User']", 'unique': 'True'}) - } - } - - complete_apps = ['lead_center'] \ No newline at end of file diff --git a/karinacms/lead_center/urls.py b/karinacms/lead_center/urls.py deleted file mode 100644 index f12401c..0000000 --- a/karinacms/lead_center/urls.py +++ /dev/null @@ -1,23 +0,0 @@ -from django.conf.urls import patterns, include, url - -from django.contrib import admin -from lead_center import views -admin.autodiscover() - -urlpatterns = patterns('', - url(r'^$', 'lead_center.views.index', name='index'), - # url(r'^about/', 'lead_center.views.about', name='about'), - url(r'^add_lead/(?P.+)?', 'lead_center.views.lead_form', name='add_lead'), - url(r'^edit_lead/(?P\d+)/$', 'lead_center.views.lead_edit_form', name='edit_lead'), - url(r'^lead_page/(?P.+)?', 'lead_center.views.lead_page', name='lead_page'), - url(r'^products/', 'lead_center.views.product_list', name='product_list'), - url(r'^campaigns/', 'lead_center.views.campaign_list', name='campaign_list'), - url(r'^statuses/', 'lead_center.views.status_list', name='status_list'), - # url(r'^blog/', includelead_center('blog.urls')), - url(r'^register/', 'lead_center.views.register', name='register'),#TODO: remove those paths to the root urls.py - url(r'^login/', 'lead_center.views.user_login', name='login'), - url(r'^logout/', 'lead_center.views.user_logout', name='logout'), - url(r'^search_list/$', 'lead_center.views.search_list', name='search_list'), - url(r'^edit/(?P.+)/(?P\d+)$', 'lead_center.views.edit_obj', name='edit_obj'), #url(r'^admin/', include(admin.site.urls)), - url(r'^delete/(?P.+)/(?P\d+)$', 'lead_center.views.delete_obj', name='delete_obj'), -) \ No newline at end of file diff --git a/karinacms/lead_center/views.py b/karinacms/lead_center/views.py deleted file mode 100644 index ed60148..0000000 --- a/karinacms/lead_center/views.py +++ /dev/null @@ -1,268 +0,0 @@ -from django.shortcuts import render, redirect -from django.contrib.auth.models import User -from django.contrib.auth import authenticate, login, logout -from django.contrib.auth.decorators import login_required -from django.db.models import Count -from .forms import LeadForm, CampaignForm, leadCommentForm, UserForm, UserInfoForm, ProductForm, LeadStatusForm -from .models import Campaign, Lead, LeadComment, LeadStatus, UserInfo, Product -from django.http import HttpResponseRedirect, HttpResponse -from datetime import datetime -from django.conf import settings - -from rest_framework import viewsets, permissions -from .serializers import LeadSerializer -from .custom_permissions import PostOnly - -class LeadViewSet(viewsets.ModelViewSet): - """ - API endpoint that allows leads being viewed and edited - """ - model = Lead - serializer_class = LeadSerializer - permission_classes = [PostOnly] - - -def register(request): - registered = False - userForm = UserForm(request.POST or None) - userInfoForm = UserInfoForm(request.POST or None) - if userForm.is_valid() and userInfoForm.is_valid(): - user = userForm.save() - user.set_password(user.password) - user.save() - userInfo = userInfoForm.save(commit=False) - userInfo.user = user - userInfo.save() - registered = True - - context = {'userForm': userForm, 'userInfoForm': userInfoForm, 'registered': registered} - return render(request, 'lead_center/register.html', context) - -def user_login(request): - msg = None - next = None - - if request.method == 'POST': - username = request.POST['username']; - password = request.POST['password']; - u = authenticate(username=username, password=password) - if u and u.is_active: - login(request, u) - redirect_url = request.GET.get('next') or '/leads/' - return HttpResponseRedirect(redirect_url) - else: - msg = 'Invalid credentials or inactive account' - # context.form = userCredentialsForm - context = {'msg': msg} - return render(request, 'lead_center/login.html', context) - -@login_required -def lead_form(request, campaign_name='eartohear.info'): - campaign = None - try: - campaign = Campaign.objects.get(name=campaign_name) - print campaign - except Campaign.DoesNotExist: - pass # do stuff - - form = LeadForm(request.POST or None) - - context_dict = {'form': form, 'title': 'Create new lead'} - if form.is_valid(): - # do stuff - lead = form.save(commit=False) - lead.campaign = campaign - lead.save() - context_dict['success'] = True - - return render(request, 'lead_center/lead_form.html', context_dict) - -@login_required -def lead_edit_form(request, lead_id): - leadData=None - form=None - leadEdited=False - notFound=False - title=None - try: - leadData = Lead.objects.get(id=lead_id) - print leadData.id - except Lead.DoesNotExist: - pass #pass - - if leadData: - title = 'Edit lead - ' + leadData.first_name + ' ' + leadData.last_name - form = LeadForm(request.POST or None, instance=leadData) - if form.is_valid(): - #save for and show success - leadData.save() - form.save() - leadEdited = True - else: - #no such lead - title = 'No such lead' - notFound = True - context_dict = {'title': title, 'notFound': notFound, 'leadEdited': leadEdited, 'form': form} - return render(request, 'lead_center/lead_form.html', context_dict) - -@login_required -def product_list(request): - productAdded = False - products = Product.objects.annotate(lead_count=Count('product_leads')) - #products = = Product.objects.all() - - form=ProductForm(request.POST or None) - if form.is_valid(): - product = form.save() - product.save() - productAdded = True - context_dict = {'products': products, 'form': form, 'productAdded': productAdded, 'obj_type': 'Product'} - return render(request, 'lead_center/product_list.html', context_dict) - -@login_required -def search_list(request): - object_type = request.GET['object_type'] - query_string = request.GET['query_string'] - if object_type == 'Campaign': - model_class = Campaign - objStr = 'campaign' - elif object_type == 'Product': - model_class = Product - objStr = 'product' - elif object_type == 'Status': - model_class = LeadStatus - objStr = 'status' - elif object_type == 'Lead': - model_class = Lead - objStr = 'lead' - result_set = model_class.objects.filter(name__icontains=query_string) - return render(request, 'lead_center/common/generic_list.html', {'obj': result_set, 'objStr': objStr}) - -@login_required -def delete_obj(request, obj_type, obj_id): - if obj_type == 'campaign': - title = 'Delete campagign?' - model_class = Campaign - redirect_url = 'campaign_list' - elif obj_type == 'product': - title = 'Delete product?' - model_class = Product - redirect_url = 'product_list' - elif obj_type == 'status': - title = 'Delete status?' - model_class = LeadStatus - redirect_url = 'status_list' - else: - raise Http404 - - success = None - try: - obj = model_class.objects.get(pk=obj_id) - except (Campaign.DoesNotExist, Product.DoesNotExist): - raise Http404 - - if request.method == "POST" and obj: - obj.delete() - return redirect(redirect_url) - - return render(request, 'lead_center/common/delete_obj.html', {'title': delete_obj, 'success': success, 'object': obj}) - - -@login_required -def edit_obj (request, obj_type, obj_id): - if obj_type == 'campaign': - model = Campaign - form_class = CampaignForm - title = 'Edit campaign' - redirect_url = 'campaign_list' - elif obj_type == 'product': - model = Product - form_class = ProductForm - title = 'Edit product' - redirect_url = 'product_list' - elif obj_type == 'status': - model = LeadStatus - form_class = LeadStatusForm - title = 'Edit lead status' - redirect_url = 'status_list' - else: - raise Http404 - - success = None - try: - obj = model.objects.get(pk=obj_id) - except model.DoesNotExist: - raise Http404 - - form = form_class(request.POST or None, instance=obj) - - if form.is_valid() and obj: - form.save() - return redirect(redirect_url) - return render(request, 'lead_center/common/edit_obj.html', {'title': title, 'formTitle': obj.name, 'form': form}) - - - -@login_required -def campaign_list(request): - campaignAdded = False - campaigns = Campaign.objects.annotate(lead_count=Count('campaign_leads')) - #products = = Product.objects.all() - form=CampaignForm(request.POST or None) - if form.is_valid(): - campaign = form.save() - campaignAdded = True - context_dict = {'campaigns': campaigns, 'form': form, 'campaignAdded': campaignAdded, 'obj_type': 'Campaign'} - return render(request, 'lead_center/campaign_list.html', context_dict) - -@login_required -def status_list(request): - statusAdded = False - statuses = LeadStatus.objects.annotate(lead_count=Count('status_leads')) - #products = = Product.objects.all() - form=LeadStatusForm(request.POST or None) - if form.is_valid(): - status = form.save() - statusAdded = True - context_dict = {'statuses': statuses, 'form': form, 'statusAdded': statusAdded, 'obj_type': 'Status'} - return render(request, 'lead_center/status_list.html', context_dict) - - -@login_required -def user_logout(request): - logout(request) - return HttpResponseRedirect('/leads/') - -def index(request): - leads = Lead.objects.all().order_by('phone') - context_dict = {'leads': leads} - if request.session.has_key('last_visit'): - last_visit = request.session.get('last_visit') - visits = request.session.get('visits', 0) - if(datetime.now() - datetime.strptime(last_visit[:-7], "%Y-%m-%d %H:%M:%S")).days > 0: - request.session['last_visit'] = str(datetime.now()) - request.session['visits'] = visits + 1 - else: - request.session['last_visit'] = str(datetime.now()) - request.session['visits'] = 1 - return render(request, 'lead_center/index.html', context_dict) - -@login_required -def lead_page(request, lead_name=None): - split_name = lead_name.split('-') - leads = None - comment_list = None - comment_success = False - - leads = Lead.objects.filter(first_name = split_name[0], last_name = split_name[1]) - - form = leadCommentForm(request.POST or None) - if leads: - comment_list = LeadComment.objects.filter(lead = leads[0]) - if leads and form.is_valid(): - comment = form.save(commit=False) - comment.lead = leads[0]#change this to many to many blat - comment.save() - comment_success = True - context_dict = {'leads': leads, 'title': lead_name, 'form': form, 'comment_list': comment_list, 'comment_success': comment_success} - return render(request, 'lead_center/lead_page.html', context_dict) \ No newline at end of file diff --git a/karinacms/requirements.txt b/karinacms/requirements.txt index fe103b2..0252a9a 100644 --- a/karinacms/requirements.txt +++ b/karinacms/requirements.txt @@ -1,8 +1,9 @@ Django==1.6 Markdown==2.3.1 -PIL==1.1.7 +#PIL==1.1.7 South==0.8.4 argparse==1.2.1 distribute==0.6.24 djangorestframework==2.3.10 wsgiref==0.1.2 +requests diff --git a/karinacms/templates/lead_center/about.html b/karinacms/templates/dev_center/about.html similarity index 65% rename from karinacms/templates/lead_center/about.html rename to karinacms/templates/dev_center/about.html index 7067dc5..8f7d060 100644 --- a/karinacms/templates/lead_center/about.html +++ b/karinacms/templates/dev_center/about.html @@ -2,21 +2,21 @@ {% load static %} - Lead management - about + Dev management - about

About the system

- A simple system to track and manage leads from different capmpagigns and landing pages. + A simple system to track and manage devs from different capmpagigns and landing pages.

{{ boldmessage }}
- Home + Home
campus diff --git a/karinacms/templates/lead_center/campaign_list.html b/karinacms/templates/dev_center/campaign_list.html similarity index 86% rename from karinacms/templates/lead_center/campaign_list.html rename to karinacms/templates/dev_center/campaign_list.html index a4cbd82..f1bd94d 100644 --- a/karinacms/templates/lead_center/campaign_list.html +++ b/karinacms/templates/dev_center/campaign_list.html @@ -1,4 +1,4 @@ -{% extends "lead_center/common/base.html" %} +{% extends "dev_center/common/base.html" %} {% block title %}Campaigns{% endblock %} {% block content %}

Campaigns

@@ -15,14 +15,14 @@

Campaigns

- Lead count + Dev count
Actions
- {% include 'common/generic_list.html' with obj=campigns objStr="campaign" %} + {% include 'common/generic_list.html' with obj=campaigns objStr="campaign" %}
{% else %} diff --git a/karinacms/templates/lead_center/common/base.html b/karinacms/templates/dev_center/common/base.html similarity index 87% rename from karinacms/templates/lead_center/common/base.html rename to karinacms/templates/dev_center/common/base.html index 07e34cf..43d3ddd 100644 --- a/karinacms/templates/lead_center/common/base.html +++ b/karinacms/templates/dev_center/common/base.html @@ -3,7 +3,7 @@ {% load static %} {% block title %}{% endblock %} - + @@ -11,33 +11,33 @@ - {% include "lead_center/common/header.html" %} + {% include "dev_center/common/header.html" %}

Options