Skip to content

Commit

Permalink
Merge branch 'dev' into master
Browse files Browse the repository at this point in the history
  • Loading branch information
DEKHTIARJonathan committed Aug 11, 2017
2 parents 25fd6f9 + 3ee80fc commit 3ff3fca
Show file tree
Hide file tree
Showing 57 changed files with 1,007 additions and 347 deletions.
5 changes: 4 additions & 1 deletion .cfignore
Expand Up @@ -118,6 +118,7 @@ media/images/interest_photos/
_unused_/
codedeploy/
example_files/
certificate/
fieldkeys/
lib_bin/
media/
Expand All @@ -128,8 +129,10 @@ venv/
.env
.env.dist
.gitignore
circle.yml
.travis.yml
app.json
appspec.yml
pytest.ini
README.md
README.md
*.yml
19 changes: 14 additions & 5 deletions application/settings.py
Expand Up @@ -131,8 +131,6 @@ def assign_env_value(var_name):
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
Expand Down Expand Up @@ -268,10 +266,21 @@ def assign_env_value(var_name):
USE_L10N = True
USE_TZ = True

# Honor the 'X-Forwarded-Proto' header for request.is_secure()
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

if not DEBUG:
# Honor the 'X-Forwarded-Proto' header for request.is_secure()
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_HSTS_PRELOAD = True
SECURE_HSTS_SECONDS = 3600

SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
X_FRAME_OPTIONS = 'DENY'

SECURE_BROWSER_XSS_FILTER = True
SECURE_CONTENT_TYPE_NOSNIFF = True

SECURE_SSL_REDIRECT = True
SECURE_REDIRECT_EXEMPT = (
r'^healthcheck\/?$',
Expand Down
Binary file modified certificate/SSL_Certificate.crypto
Binary file not shown.
9 changes: 8 additions & 1 deletion feedcrunch/admin.py
Expand Up @@ -145,4 +145,11 @@ class RSSSubsStatAdmin(admin.ModelAdmin):

admin.site.register(RSSSubsStat, RSSSubsStatAdmin)

#admin.site.register(RSSArticle)
# ==================== SlackIntegration ============================
class SlackIntegrationAdmin(admin.ModelAdmin):
list_display = ('id', 'user', 'team_name', 'channels', 'access_token')
ordering = ('user','team_name')

search_fields = ('user','team_name')

admin.site.register(SlackIntegration, SlackIntegrationAdmin)
28 changes: 28 additions & 0 deletions feedcrunch/migrations/0020_gplus_replaced_by_slack.py
@@ -0,0 +1,28 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11 on 2017-04-11 21:08
from __future__ import unicode_literals

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('feedcrunch', '0019_feeduser_modified_linkedin_credentials'),
]

operations = [
migrations.RenameField(
model_name='feeduser',
old_name='pref_post_repost_GPlus',
new_name='pref_post_repost_Slack',
),
migrations.RemoveField(
model_name='feeduser',
name='gplus_token',
),
migrations.RemoveField(
model_name='feeduser',
name='gplus_token_secret',
),
]
32 changes: 32 additions & 0 deletions feedcrunch/migrations/0021_slack_integration_model_creation.py
@@ -0,0 +1,32 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11 on 2017-04-11 22:34
from __future__ import unicode_literals

from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import encrypted_model_fields.fields


class Migration(migrations.Migration):

dependencies = [
('feedcrunch', '0020_gplus_replaced_by_slack'),
]

operations = [
migrations.CreateModel(
name='SlackIntegration',
fields=[
('id', models.AutoField(primary_key=True, serialize=False)),
('team_name', models.CharField(max_length=100)),
('channels', models.CharField(blank=True, default='', max_length=100, null=True)),
('access_token', encrypted_model_fields.fields.EncryptedCharField()),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='rel_slack_integrations', to=settings.AUTH_USER_MODEL)),
],
),
migrations.AlterUniqueTogether(
name='slackintegration',
unique_together=set([('team_name', 'user')]),
),
]
8 changes: 5 additions & 3 deletions feedcrunch/model_files/models_rss_subscriber.py
Expand Up @@ -64,19 +64,21 @@ def __str__(self):

# First, define the Manager subclass.
class RSSSubsStatManager(models.Manager):
def create(self, user=None, count=0, date=timezone.localtime(timezone.now() - datetime.timedelta(days=1)).date()):
def create(self, user=None, count=0, date=None):
try:
if user is None:
raise Exception("Feedname is missing")

elif isinstance(user, str):
user = FeedUser.objects.get(username=user) # If fails, raise an Exception

if date is None:
date = datetime.datetime.now().date() - datetime.timedelta(days=1)

return super(RSSSubsStatManager, self).create(user=user, count=count, date=date)

except Exception as e:
#return {'status': False, 'error': str(e)}
return None
return {'status': False, 'error': str(e), 'timestamp': datetime.datetime.now(), 'timestamp_tz': timezone.now()}

class RSSSubsStat(models.Model):

Expand Down
24 changes: 24 additions & 0 deletions feedcrunch/model_files/models_slack_integrations.py
@@ -0,0 +1,24 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from __future__ import unicode_literals
from django.db import models

from .models_user import FeedUser

from encrypted_model_fields .fields import EncryptedCharField

############################## TAG MODEL ###################################

class SlackIntegration(models.Model):
id = models.AutoField(primary_key=True)
user = models.ForeignKey(FeedUser, related_name='rel_slack_integrations', on_delete=models.CASCADE)
team_name = models.CharField(max_length=100, blank=False, null=False)
channels = models.CharField(max_length=100, blank=True, null=True, default="")
access_token = EncryptedCharField(max_length=500, blank=False, null=False)

class Meta:
unique_together = (("team_name", "user"),)

def __str__(self):
return self.team_name + " // " + self.user.username
67 changes: 38 additions & 29 deletions feedcrunch/model_files/models_user.py
Expand Up @@ -23,9 +23,10 @@

from feedcrunch.models import Continent, Country, Estimator, Interest

from oauth.twitterAPI import TwitterAPI
from oauth.twitterAPI import TwitterAPI
from oauth.facebookAPI import FacebookAPI
from oauth.linkedinAPI import LinkedInAPI
from oauth.slackAPI import SlackAPI

from validators import ASCIIUsernameValidator, UnicodeUsernameValidator

Expand Down Expand Up @@ -332,9 +333,6 @@ class FeedUser(AbstractFeedUser):
linkedin_access_token = EncryptedCharField(max_length=500, default='', blank=True, null=True)
linkedin_token_expire_datetime = models.DateTimeField(auto_now_add=False, default=None, blank=True, null=True)

gplus_token = EncryptedCharField(max_length=500, default='', blank=True, null=True)
gplus_token_secret = EncryptedCharField(max_length=500, default='', blank=True, null=True)

social_fields = {
'twitter' : {
'token' : "twitter_token",
Expand All @@ -348,10 +346,6 @@ class FeedUser(AbstractFeedUser):
'token' : "linkedin_access_token",
'expire_datetime' : "linkedin_token_expire_datetime"
},
'gplus' : {
'token' : "gplus_token",
'secret' : "gplus_token_secret"
},
}

################################### ============================== ###################################
Expand All @@ -365,8 +359,8 @@ class FeedUser(AbstractFeedUser):

pref_post_repost_TW = models.BooleanField(default=False)
pref_post_repost_FB = models.BooleanField(default=False)
pref_post_repost_GPlus = models.BooleanField(default=False)
pref_post_repost_LKin = models.BooleanField(default=False)
pref_post_repost_Slack = models.BooleanField(default=False)

################################### ============================== ###################################
# NEWSLETTER PREFERENCES #
Expand Down Expand Up @@ -511,26 +505,27 @@ def is_social_network_enabled(self, network=None):

rslt = dict()

for social_net in list(self.social_fields.keys()):
for social_net in list(self.social_fields.keys()) + ["slack"]:
rslt[social_net] = self.is_social_network_enabled(network=social_net)

return rslt

elif network in list(self.social_fields.keys()):
if network in ["facebook", "linkedin"]:
token = getattr(self, self.social_fields[network]["token"])
expire_datetime = getattr(self, self.social_fields[network]["expire_datetime"])

if network in ["facebook", "linkedin"]:
token = getattr(self, self.social_fields[network]["token"])
expire_datetime = getattr(self, self.social_fields[network]["expire_datetime"])
if expire_datetime is not None:
return token != "" and timezone.now() < expire_datetime
else:
return False

if expire_datetime is not None:
return token != "" and timezone.now() < expire_datetime
else:
return False
elif network == "twitter":
token = getattr(self, self.social_fields[network]["token"])
secret = getattr(self, self.social_fields[network]["secret"])
return token != "" and secret != ""

else:
token = getattr(self, self.social_fields[network]["token"])
secret = getattr(self, self.social_fields[network]["secret"])
return token != "" and secret != ""
elif network == "slack":
return bool(self.rel_slack_integrations.all().count())

else:
raise Exception("The network requested " + network + "doesn't exist in this application")
Expand All @@ -545,8 +540,8 @@ def is_facebook_enabled(self):
def is_linkedin_enabled(self):
return self.is_social_network_enabled(network="linkedin")

def is_gplus_enabled(self):
return self.is_social_network_enabled(network="gplus")
def is_slack_enabled(self):
return self.is_social_network_enabled(network="slack")

def is_social_network_activated(self, network):
if network == "twitter":
Expand All @@ -571,27 +566,41 @@ def is_social_network_activated(self, network):

elif network == "linkedin":
if self.is_social_network_enabled(network=network):
return True
if LinkedInAPI(self).verify_credentials()['status']:
return True
else:
self.reset_social_network_credentials(network=network)
return False
else:
return False

elif network == "gplus":
elif network == "slack":
if self.is_social_network_enabled(network=network):
return True
if SlackAPI(self).verify_credentials()['status']:
return True
else:
self.reset_social_network_credentials(network=network)
return False
else:
return False

else:
return False
raise Exception("The network requested " + network + "doesn't exist in this application")

def reset_social_network_credentials(self, network):
if network in ["facebook", "linkedin"]:
setattr(self, self.social_fields[network]["token"], "")
setattr(self, self.social_fields[network]["expire_datetime"], None)
else:

elif network == "twittter":
setattr(self, self.social_fields[network]["token"], "")
setattr(self, self.social_fields[network]["secret"], "")

elif network == "slack":
self.rel_slack_integrations.all().delete()
else:
raise Exception("The network requested " + network + "doesn't exist in this application")

self.save()
################################### ============================== ###################################
# Subscribtion Management #
Expand Down
1 change: 1 addition & 0 deletions feedcrunch/models.py
Expand Up @@ -15,3 +15,4 @@
from .model_files.models_rssarticle import RSSArticle
from .model_files.models_rss_assocs import RSSFeed_Sub, RSSArticle_Assoc
from .model_files.models_rss_subscriber import RSSSubscriber, RSSSubsStat
from .model_files.models_slack_integrations import SlackIntegration

0 comments on commit 3ff3fca

Please sign in to comment.