diff --git a/backend/app_be/urls.py b/backend/app_be/urls.py index 241e0db..a94fb35 100644 --- a/backend/app_be/urls.py +++ b/backend/app_be/urls.py @@ -26,7 +26,7 @@ urlpatterns = [ path('admin/', admin.site.urls), url(r'^api/login', LoginClass.login), url(r'^getSixTweets', TwitterClass.getLastSixTweets), - url(r'^getTwelveTweets', TwitterClass.getLastSixTweets), + url(r'^getMoreTweets/(?P\w{0,50})', TwitterClass.getMoreTweets), url(r'feeds/', FeedViewSet.update_feed) ] urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) diff --git a/backend/app_be/views/rest_api.py b/backend/app_be/views/rest_api.py index 6721c42..d5d5611 100644 --- a/backend/app_be/views/rest_api.py +++ b/backend/app_be/views/rest_api.py @@ -1,5 +1,6 @@ import logging +from app_be.views.twitter_api import twitter_api from django.http import JsonResponse, HttpRequest from py_jwt_validator import PyJwtValidator, PyJwtException @@ -9,6 +10,7 @@ from rest_framework.viewsets import ModelViewSet from app_be.models import Feed from app_be.serializers import FeedSerializer +from twitter import Status logger = logging.getLogger(__name__) @@ -60,9 +62,25 @@ class LoginClass: class TwitterClass: @staticmethod @api_view(['GET']) - def getLastSixTweets(): - return JsonResponse({[{"asdf", "asdf", "sdfasdf", "asdf"}, {"asdf", "asdf", "sdfasdf", "asdf"}]}, safe=False, - status=200) + def getLastSixTweets(request): + + #TODO: Bearer Token im FE einfügen + '''user_sub = authorize(request) + if not user_sub: + return JsonResponse({}, status=401)''' + + return JsonResponse(status=200,data=twitter_api.get_last_six_tweets(),safe=False) + + @staticmethod + @api_view(['GET']) + def getMoreTweets(request,twitter_id): + + #TODO: Bearer Token im FE einfügen + '''user_sub = authorize(request) + if not user_sub: + return JsonResponse({}, status=401)''' + + return JsonResponse(status=200,data=twitter_api.get_more_tweets(twitter_id),safe=False) class FeedViewSet(ModelViewSet): diff --git a/backend/app_be/views/twitter_api.py b/backend/app_be/views/twitter_api.py index 8690c36..d63f4eb 100644 --- a/backend/app_be/views/twitter_api.py +++ b/backend/app_be/views/twitter_api.py @@ -1,6 +1,7 @@ +from datetime import datetime + import twitter import os -from app_be.models import Tweet from dotenv import load_dotenv load_dotenv() @@ -19,18 +20,51 @@ class twitter_api: @staticmethod def get_last_six_tweets(): - last_six = api.GetUserTimeline('waecmg4',count=6) - print(last_six) + + 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_last_twelve_tweets(): - last_twelve = api.GetUserTimeline('waecmg4',count=12) - print(last_twelve) + def get_more_tweets(twitter_id): - @staticmethod - def get_last_n_tweets(n): - last_twelve = api.GetUserTimeline('waecmg4',count=n) - print(last_twelve) + 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" + + response.append( + {'icon': None, 'text': tweet.text, 'url': twitter_url, 'created_date': tweet_date, + 'tweet_id': tweet.id}) + + return response @staticmethod def post_update(text, url): diff --git a/backend/setup.py b/backend/setup.py index 7a4eca5..949dd83 100644 --- a/backend/setup.py +++ b/backend/setup.py @@ -20,7 +20,8 @@ setup(name='waecm-2021-group-04', 'python-twitter==3.5', 'python-dotenv==0.17.1', 'feedsearch==1.0.12', - 'Pillow==8.2.0' + 'Pillow==8.2.0', + 'python-dateutil==2.8.1' ], license='BSD License', # example license description='DESCRIPTION') diff --git a/frontend/src/app/app.module.ts b/frontend/src/app/app.module.ts index 7ff4aeb..cccea10 100644 --- a/frontend/src/app/app.module.ts +++ b/frontend/src/app/app.module.ts @@ -31,6 +31,7 @@ import {MaterialFileInputModule} from 'ngx-material-file-input'; import { DialogComponent } from './component/dialog/dialog.component'; import {MatDialogModule} from '@angular/material/dialog'; import {InterceptorService} from './services/interceptor.service'; +import {MatCardModule} from "@angular/material/card"; @NgModule({ declarations: [LandingComponent, LoginComponent, NavigationComponent, @@ -54,7 +55,8 @@ import {InterceptorService} from './services/interceptor.service'; MatSnackBarModule, MatCheckboxModule, MaterialFileInputModule, - MatDialogModule + MatDialogModule, + MatCardModule ], // enables injecting providers: [ diff --git a/frontend/src/app/component/tweets/tweets.component.html b/frontend/src/app/component/tweets/tweets.component.html index 03ff5a9..5f8fc20 100644 --- a/frontend/src/app/component/tweets/tweets.component.html +++ b/frontend/src/app/component/tweets/tweets.component.html @@ -5,24 +5,26 @@
RSS-Feed erstellen -
+
Keine Tweets vorhanden
Schau später noch einmal vorbei!
-
+
+
Feed-Icon

{{tweet.text}} - {{tweet.date_time}}

- {{tweet.url}} + - {{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 31699d6..712712a 100644 --- a/frontend/src/app/component/tweets/tweets.component.ts +++ b/frontend/src/app/component/tweets/tweets.component.ts @@ -5,6 +5,7 @@ import {FeedService} from '../../services/feed.service'; import {IFeed} from '../../interfaces/feed.interface'; import {Observable} from 'rxjs'; import {Tweet} from "../../interfaces/interface"; +import {SnackbarService} from "../../services/snackbar.service"; @Component({ @@ -19,7 +20,8 @@ export class TweetsComponent implements OnInit { constructor(private http: HttpClient, private authService: AuthService, - private _feedService: FeedService) { + private _feedService: FeedService, + private _snackbarService: SnackbarService) { this._feedService.getFeeds().subscribe( (data: any) => { this.feeds = data; @@ -33,29 +35,43 @@ export class TweetsComponent implements OnInit { ngOnInit(): void { this.fillTweets() + console.log(this.tweets) } loadMore() { - const headerDict = { - 'Authorization': 'Bearer ' + this.authService.getToken(), - }; + console.log(this.tweets); + + this.http.get('http://127.0.0.1:8000/getMoreTweets/'+this.tweets[this.tweets.length-1].tweet_id+'/').subscribe(data => { + console.log(data) + + if(data.length == 0){ + this._snackbarService.show("Keine weiteren Tweets vorhanden","Schließen"); + } - return this.http.get('http://localhost:8000/api/login', - { - headers: new HttpHeaders(headerDict), - observe: 'response', - }) - .subscribe(data => { - console.log(data); - alert('Returned with code: ' + data['status']); - }); + for(let tweet of data){ + let position = tweet.text.search(": http"); + tweet.text = tweet.text.substring(0,position); + this.tweets.push(tweet); + } + } + ); + } - fillTweets(){ + fillTweets(){ + this.http.get('http://127.0.0.1:8000/getSixTweets/').subscribe(data => { + console.log(data) + for(let tweet of data){ + let position = tweet.text.search(": http"); + tweet.text = tweet.text.substring(0,position); + this.tweets.push(tweet); + } + } + ); } diff --git a/frontend/src/app/interfaces/interface.ts b/frontend/src/app/interfaces/interface.ts index 9bd7478..542dd8a 100644 --- a/frontend/src/app/interfaces/interface.ts +++ b/frontend/src/app/interfaces/interface.ts @@ -11,7 +11,8 @@ export interface Tweet { icon: any; text: string; - date_time: DateTimeFormat; - url: String; + url: string; + created_date: string; + tweet_id: number; }