diff --git a/backend/app_be/media/default-icon.svg b/backend/app_be/media/default-icon.png similarity index 100% rename from backend/app_be/media/default-icon.svg rename to backend/app_be/media/default-icon.png diff --git a/backend/app_be/models.py b/backend/app_be/models.py index 1724443..86ff2a7 100644 --- a/backend/app_be/models.py +++ b/backend/app_be/models.py @@ -9,7 +9,7 @@ class User(models.Model): class Feed(models.Model): url = models.TextField(blank=False, null=False, validators=[URLValidator(['http', 'https'])]) active = models.BooleanField() - icon = models.FileField(upload_to='feed-icons', blank=True, null=False, default='default-icon.svg', + icon = models.FileField(upload_to='feed-icons', blank=True, null=False, default='default-icon.png', validators=[FileExtensionValidator(['png', 'svg'])]) keywords = models.TextField(blank=False, null=False) match_all_keywords = models.BooleanField(blank=True, default=False) @@ -21,7 +21,7 @@ class FeedEntry(models.Model): class Tweet(models.Model): - feed = models.ForeignKey(Feed, null=True, on_delete=models.SET_NULL) + icon = models.FileField(blank=True, null=False, default='default-icon.png') text = models.CharField(max_length=500) date_time = models.DateTimeField() url = models.CharField(max_length=500) diff --git a/backend/app_be/views/twitter_api.py b/backend/app_be/views/twitter_api.py index d63f4eb..a32cdee 100644 --- a/backend/app_be/views/twitter_api.py +++ b/backend/app_be/views/twitter_api.py @@ -2,7 +2,10 @@ from datetime import datetime import twitter import os + +from app_be.models import Tweet from dotenv import load_dotenv +from django.conf import settings load_dotenv() @@ -21,34 +24,11 @@ class twitter_api: @staticmethod def get_last_six_tweets(): - last_six = api.GetUserTimeline(screen_name='waecmg4',count=6,exclude_replies=True,include_rts=False) + last_six = api.GetUserTimeline(screen_name='waecmg4', count=6, exclude_replies=True, include_rts=False) print(type(last_six)) response = [] - for tweet in last_six: - print(tweet) - - parsed_date = datetime.strptime(tweet.created_at,"%a %b %d %H:%M:%S +0000 %Y") - tweet_date = datetime.strftime(parsed_date,"%d.%m.%y %H:%M") - - if tweet.urls: - twitter_url = tweet.urls[0].expanded_url - else: - twitter_url = "No url for tweet found" - - response.append({'icon': None,'text':tweet.text,'url':twitter_url,'created_date':tweet_date, 'tweet_id':tweet.id}) - - return response - - - @staticmethod - def get_more_tweets(twitter_id): - - last_six = api.GetUserTimeline(screen_name='waecmg4', count=6, exclude_replies=True, include_rts=False, max_id=twitter_id) - - response = [] - for tweet in last_six: print(tweet) @@ -60,8 +40,52 @@ class twitter_api: else: twitter_url = "No url for tweet found" + tmp_text = str(tweet.text) + end = tmp_text.find(": http") + tmp_text = tmp_text[0:end] + backend_tweet: Tweet = Tweet.objects.filter(text=tmp_text) + + if not backend_tweet: + icon = "http://localhost:8000/media/default-icon.png" + else: + icon = "http://localhost:8000/media/feed-icons/" + os.path.basename(backend_tweet[0].icon.file.name) + + response.append({'icon': icon, 'text': tweet.text, 'url': twitter_url, 'created_date': tweet_date, + 'tweet_id': tweet.id}) + + return response + + @staticmethod + def get_more_tweets(twitter_id): + + last_six = api.GetUserTimeline(screen_name='waecmg4', count=6, exclude_replies=True, include_rts=False, + max_id=twitter_id) + + response = [] + + for tweet in last_six: + print(tweet) + + parsed_date = datetime.strptime(tweet.created_at, "%a %b %d %H:%M:%S +0000 %Y") + tweet_date = datetime.strftime(parsed_date, "%d.%m.%y %H:%M") + + if tweet.urls: + twitter_url = tweet.urls[0].expanded_url + else: + twitter_url = "No url for tweet found" + + tmp_text = str(tweet.text) + end = tmp_text.find(": http") + tmp_text = tmp_text[0:end] + backend_tweet: Tweet = Tweet.objects.filter(text=tmp_text) + + if not backend_tweet: + icon = "http://localhost:8000/media/default-icon.png" + else: + icon = "http://localhost:8000/media/feed-icons/" + os.path.basename(backend_tweet[0].icon.file.name) + response.append( - {'icon': None, 'text': tweet.text, 'url': twitter_url, 'created_date': tweet_date, + {'icon': icon, 'text': tweet.text, 'url': twitter_url, 'created_date': tweet_date, 'tweet_id': tweet.id}) return response diff --git a/backend/app_be/views/twitter_bot.py b/backend/app_be/views/twitter_bot.py index 7d4852b..87932f8 100644 --- a/backend/app_be/views/twitter_bot.py +++ b/backend/app_be/views/twitter_bot.py @@ -46,7 +46,7 @@ class twitter_bot(threading.Thread): # preparing tweet new_tweet = Tweet() - new_tweet.feed = feed + new_tweet.icon = feed.icon new_tweet.text = current.title if 'published' in current: diff --git a/frontend/src/app/component/tweets/tweets.component.html b/frontend/src/app/component/tweets/tweets.component.html index 5f8fc20..3807e70 100644 --- a/frontend/src/app/component/tweets/tweets.component.html +++ b/frontend/src/app/component/tweets/tweets.component.html @@ -10,22 +10,22 @@
Schau später noch einmal vorbei! -
-
-
- -
-
- Feed-Icon -
-
-

{{tweet.text}} - - {{tweet.created_date}}
- {{tweet.url}}

-
+
+
+
+ +
+
+ Feed-Icon +
+
+

{{tweet.text}} + - {{tweet.created_date}}
+ {{tweet.url}}

+
+
+
- -
diff --git a/frontend/src/app/component/tweets/tweets.component.ts b/frontend/src/app/component/tweets/tweets.component.ts index 8bdb03e..d7e9870 100644 --- a/frontend/src/app/component/tweets/tweets.component.ts +++ b/frontend/src/app/component/tweets/tweets.component.ts @@ -3,10 +3,13 @@ import {AuthService} from '../../services/auth.service'; import {HttpClient} from '@angular/common/http'; import {FeedService} from '../../services/feed.service'; import {IFeed} from '../../interfaces/feed.interface'; -import {Observable} from 'rxjs'; +import {throwError} from 'rxjs'; import {Tweet} from '../../interfaces/interface'; import {SnackbarService} from '../../services/snackbar.service'; import {environment} from '../../../environments/environment'; +import {DialogComponent} from '../dialog/dialog.component'; +import {MatDialog} from '@angular/material/dialog'; +import {NGXLogger} from 'ngx-logger'; @Component({ @@ -17,20 +20,25 @@ import {environment} from '../../../environments/environment'; export class TweetsComponent implements OnInit { tweets: Tweet[] = []; - feeds: Observable[] = []; + feeds: IFeed[] = []; constructor(private http: HttpClient, private authService: AuthService, private _feedService: FeedService, - private _snackbarService: SnackbarService) { + private _snackbarService: SnackbarService, + private _dialog: MatDialog, + private _logger: NGXLogger) { this._feedService.getFeeds().subscribe( (data: any) => { this.feeds = data; + }, + err => { + this.errorDialog(); + this._logger.error(err); + return throwError(err); } ); - - } ngOnInit(): void { @@ -57,8 +65,12 @@ export class TweetsComponent implements OnInit { for (const tweet of data) { const position = tweet.text.search(': http'); tweet.text = tweet.text.substring(0, position); - this.tweets.push(tweet); } + }, + err => { + this.errorDialog(); + this._logger.error(err); + return throwError(err); } ); @@ -73,9 +85,27 @@ export class TweetsComponent implements OnInit { tweet.text = tweet.text.substring(0, position); this.tweets.push(tweet); } + }, + err => { + this.errorDialog(); + this._logger.error(err); + return throwError(err); } ); } + + public errorDialog() { + const dialogRef = this._dialog.open(DialogComponent, { + data: { + title: 'Serverfehler', + body: 'Fehler bei der Kommunikation mit Twitter").', + abort: 'Abbrechen', + confirm: 'OK', + hideAbort: true + } + }); + } + }