Load Tweets, load more tweets finished

This commit is contained in:
Manuel Hude 2021-05-04 14:10:43 +02:00
parent e252e07179
commit 0f2d27d5c3
8 changed files with 110 additions and 36 deletions

View File

@ -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<twitter_id>\w{0,50})', TwitterClass.getMoreTweets),
url(r'feeds/<int:feed_id>', FeedViewSet.update_feed)
]
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

View File

@ -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):

View File

@ -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):

View File

@ -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')

View File

@ -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: [

View File

@ -5,24 +5,26 @@
<br>
<a routerLink="/einstellungen/editieren">RSS-Feed erstellen</a>
</div>
<div class="text-center" *ngIf="feeds.length !== 0">
<div class="text-center" *ngIf="!(tweets.length > 0)">
<span>Keine Tweets vorhanden</span>
<br>
<span>Schau später noch einmal vorbei!</span>
</div>
<div *ngIf="feeds.length !== 0">
<div>
<div class="container" *ngFor="let tweet of tweets">
<div style="padding-bottom: 10px" class="container" *ngFor="let tweet of tweets">
<mat-card style="background-color: #f5f5f5">
<div class="row">
<div class="col-2 text-center padding-0 margin-auto">
<img class="feed-icon" src="{{tweet.icon}}" alt="Feed-Icon">
</div>
<div class="col-10">
<p class="overflow-break">{{tweet.text}}
<span class="white-space-no-wrap">{{tweet.date_time}}</span></p>
<a>{{tweet.url}}</a>
<span class="white-space-no-wrap"> - {{tweet.created_date}}</span><br>
<a href="{{tweet.url}}" style="cursor: pointer">{{tweet.url}}</a></p>
</div>
</div>
</mat-card>
</div>
</div>
<div class="text-center">

View File

@ -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<Tweet[]>('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(){
this.http.get<Tweet[]>('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);
}
}
);
}

View File

@ -11,7 +11,8 @@ export interface Tweet {
icon: any;
text: string;
date_time: DateTimeFormat;
url: String;
url: string;
created_date: string;
tweet_id: number;
}