Exemple #1
0
 def form_valid(self, form):
     #PostForm 객체를 저장하기 전에 글쓴이 정보를 저장해야함
     #데이터베이스에 바로저장하지 않고 연동된 모델클래스로 변환
     #p : 사용자 입력으로 제목,카테고리,글내용이 채워진 Post객체
     #(아직 데이터베이스에 저장되지않음)
     p = form.save(commit = False)
     #request.user : 요청한 클라이언트의 로그인정보(User모델클래스객체)
     #이 요청을 한 클라이언트의 유저정보를 Post객체에 저장
     p.author = self.request.user
     p.save() #데이터베이스에 저장
     #사용자가 넘겨준 이미지,파일마다 객체 생성
     #사용자가 넘겨준 이미지파일 마다 PostImage 객체 생성
     #request.FILES : 클라이언트가 서버로 보낸 파일정보를 관리하는 변수(객체)
     #f : 사용자가 보낸 이미지파일의 실제정보
     for f in self.request.FILES.getlist('images'):
         #새로운 PostImage객체를 생성(데이터베이스에 저장x)
         pi = PostImage()
         #이 요청으로 새로만들어진 Post객체와 연결
         pi.post = p
         #사용자가 보낸 이미지파일 정보를 변수에 저장
         pi.image = f
         pi.save()#데이터베이스에 새로운 PostImage객체 저장
     #사용자가 넘겨준 첨부파일 마다 PostFile 객체 생성
     for f in self.request.FILES.getlist('files'):
         pf = PostFile()
         pf.post = p
         pf.file = f
         pf.save()
         #완성된 글의 URL을 전달
     return HttpResponseRedirect( reverse('blog:detail',args=(p.id,) ) )
Exemple #2
0
 def form_valid(self, form):
     #매개변수 form : is_valid()함수를 통과한 PostForm객체
     #PostForm객체를 바탕으로  Post객체 저장
     #글쓴이(author) 변수가 비어있으므로, 데이터베이스에 저장하지 않음
     p = form.save(commit = False)
     #request.user : 요청한 클라이언트의 로그인 정보(User 모델클래스 객체)
     p.author = self.request.user
     p.save()
     #클라이언트가 보낸 첨부파일, 이미지 파일을 바탕으로 PostFile,PostInage객체 생성및 저장
     #request.FILES : 클라이언트가 서버로 보낸 파일 정보를 관리하는 변수
     
     #PostFile 객체를 생성
     for f in self.request.FILES.getlist('files'):
         #f : 파일 정보
         pf = PostFile() # 새로운 POSTFILE 모델클래스의 객체 생성
         pf.file = f
         pf.post = p
         pf.save()
     #PostImage객체를 생성
     for i in self.request.FILES.getlist('images'):
         #i : 이미지 정보
         pi = PostImage()
         pi.post = p
         pi.image = i 
         pi.save();
     #완성된 글 페이지로 URL이동
     return HttpResponseRedirect(
         reverse('blog:detail', args=(p.id,) )   )
Exemple #3
0
 def form_valid(self, form):
     obj = form.save(commit=False) #Post 객체로 변환
     #self.request == 뷰 함수의 request 매개변수
     obj.author = self.request.user#유저정보 채우기
     obj.save()                      #객체를 데이터베이스에 저장
     #사용자가 저장요청한 이미지파일, 파일 객체 생성
     #name이 'images'인 파일데이터를 추출하는 방법
     for f in self.request.FILES.getlist('images'):
         #PostImage 모델클래스의 객체 생성
         #객체 생성 시 각 변수에 값을 대입
         image = PostImage(post = obj, image = f)
         #image = PostImage()
         #image.post = obj
         #image.image = f
         image.save()
     #사용자가 준 파일 정보에서 'files'라벨로 온 데이터 추출
     for f in self.request.FILES.getlist('files'):
         #PostFile 모델클래스의 객체 생성
         file = PostFile(post = obj, file = f)
         file.save()
     #완성한 글의 URL로 이동
     return HttpResponseRedirect(reverse('blog:detail', args=(obj.id,)) )
Exemple #4
0
    def form_valid(self, form):
        #form을 썼을때 save를 하면 바로 저장이 되었고, (매개변수commit=False면 저장이 안된다.)
        #Form객체를 Post객체로 변환
        #Commit=False를 쓴 이유 : Post객체를 데이터베이스에 저장할 때 user변수에
        #값이 들어있지 않은 상태기 때문에 에러가 발생
        #p에는 지금 post객체가 저장되어 있다.
        #p : class에서 사용자 입력을 바탕으로 category, title, content변수가 채워져 있는
        #새로운 Post객체 => p.category / p.title / p.content를 쓸 수 있음
        # category, title, content는 앞으로 채워질거니까 빈칸으로 저장해져도 되는데
        # User라는 변수는 비어있으면 안된다. 그래서 저장을 하기 전에 user의 값을 써야한다.
        # Post class의 변수 5개 중 pub_date는 자동 / 카테고리,타이틀,콘텐츠는 앞으로 채울거니까 비어있도 되는데(blank=True설정), 유저는 비어있으면 안된다.
        p = form.save(commit=False)  #자동완성하면 안됨

        #user정보를 클라이언트의 유저정보로 대입
        #user정보는 request.user라는 변수에 저장됨 (사용자 요청정보가 있는 정보)
        #비로그인 상태는 None값이 저장되어 있다.
        #self.request : 해당 뷰를 요청한 클라이언트의 요청정보가 저장된 변수
        #slef.request.user : 요청한 클라이언트의 User모델클래스 객체저장 변수
        p.user = self.request.user  #최종 저장전 user를 채워준다.

        #데이터베이스에 Post객체 저장
        p.save()  #새로운 객체 생성
        # 저장을 하려면 빈칸을 허용하거나, 빈칸이 없어야 한다.
        # 다른 데이터는 blank=True이기 때문이고, user는 blank가 true가 아니다.
        # SET_NULL이라는 설정 값을 넣으면 user가 빈칸이어도 된다.

        # 사용자가 입력한 것은 request.POST / request.GET 으로 저장된다.
        # 사용자가 업로드한 파일 데이터를 바탕으로 PostFile 객체 생성
        # 사용자가 업로드한 파일의 갯수만큼 반복
        # self.request.FILES : 사용자가 업로드한 파일을 저장한 변수
        # self.request.FILES.getlist(name속성이름)
        # : 해당 입력 공간에 업로드된 파일 데이터들을 추출
        for f in self.request.FILES.getlist('files'):
            #files라는 이름으로 날라온 파일들을 list로 만들어내서 하나씩 추출해서 f라는 이름으로 반복문에서 활용하겠다.
            #files라는 이름은 form class에서 name 속성이다.
            #더블 클릭하여 자동 import/자동완성으로 안했을 경우 끝에 커서 대고 ctrl + space바 누르면 더블클릭하여 import 가능
            pf = PostFile()  #post변수(외래키)와 file변수가 있음
            #두 변수가 다 채워져야 저장이 된다.
            pf.post = p  #새로만들어진 Post객체와 연동
            pf.file = f  #사용자가 업로드한 파일을 FileField에 저장
            pf.save()  #두변수가 다 채워졌으므로 save

        # 사용자가 업로드한 이미지데이터를 바탕으로 PostImage객체 생성
        # 사용자가 'images' 입력공간에 업로드한 파일들을 바탕으로 객체생성을 하는 과정
        # forms.py에서 커스터마이징한 변수이름을 따오면 된다.
        for i in self.request.FILES.getlist('images'):
            #새로운 PostImage 객체 생성 - 데이터베이스에 저장 x
            pi = PostImage()
            pi.post = p
            pi.image = i
            pi.save()

        # blog:detail로 리다이렉트
        # Detail view는 3개 변수
        # 새로운 만들어진 Post객체의 id값으로 detail뷰의 주소 전달
        return HttpResponseRedirect(reverse('blog:detail', args=(p.id, )))
Exemple #5
0
    def test_get_image_filename(self):
        """Testing getting image filename for upload"""
        #Arrange
        user = User.objects.create_user('testuser', 'testuser@unittest', 'testpass')
        test_post = Post(author=user,
                        issue=Issue(issue_number=1),
                        title='Test Post',
                        text='Unittest'
                        )
        test_PostImage = PostImage(post=test_post)
        filename='test_image.jpg'
        expected = 'images/test-post-test_image.jpg'

        #Act
        image_file_name = m.get_image_filename(test_PostImage, filename)

        #Assert
        self.assertEqual(expected, image_file_name)
Exemple #6
0
 def form_valid(self, form):
     p = form.save(commit=False)
     p.author = self.request.user
     p.save()
     for f in self.request.FILES.getlist('files'):
         pf = PostFile()
         pf.file = f
         pf.post = p
         pf.save()
     for i in self.request.FILES.getlist('images'):
         pi = PostImage()
         pi.post = p
         pi.image = i
         pi.save()
     return HttpResponseRedirect(reverse('blog:detail', args=(p.id, )))
Exemple #7
0
    def form_valid(self, form):
        #Form 객체를 Post 객체로 변환
        #p : 사용자 입력을 바탕으로 category, title, contents변수가 채워져 있는 새로운 Post객체임
        #model.py에 post에는 category, title, contents, user, pub_date가 있음
        #category, title, contents는 사용자가 입력하고, pub_date는 자동생성됨.
        #빈칸은 원래 저장되지 않으므로(저장 시 에러), contents처럼 blank함수를 써야하나,
        #user에는 지정하지 않았으므로 앞으로 채워야함.
        #commit=False : post객체를 DB에 저장할 때 user변수에 값이 들어있지 않은 상태기 때문에 에러가 발생함.
        #따라서 DB에 저장하지 않고 연동된 모델 클래스의 객체로 변환만 함
        p = form.save(commit=False)

        #user 정보를 클라이언트의 유저정보로 대입
        #self.request : 해당 뷰를 요청한 클라이언트의 요청정보가 저장된 변수
        #self.request.user : 요청한 클라이언트의 User모델크래스 객체 저장 변수
        p.user = self.request.user

        #DB에 Post객체 저장
        #user변수에 값이 들어갔으므로 저장할 수 있게됨
        p.save()

        #(post객체에 딸려온) 사용자가 업로드한 파일 데이터를 바탕으로 PostFile 객체 생성
        #self.request.FILES : 사용자가 업로드한 파일을 저장한 변수
        #self.request.FILES.getlist(form.py의 name속성 이름(images , files )) : 해당 입력공간에 업로듣된 파일 데이터들을 추출
        #사용자가 업로드 한 파일의 갯수만큼 반복
        for f in self.request.FILES.getlist('files'):
            #새로운 PostFile (model.py에 있는) 객체 생성 - DB에 저장 X
            pf = PostFile()
            pf.post = p  #새로 만들어진 Post객체와 연동
            pf.file = f  #사용자가 업로드한 파일을 FileField에 저장

            pf.save()

        #사용자가 업로드한 이미지 데이터를 바탕으로 PostImage 객체 생성
        #사용자가 'images'입력공간에 업로드한 파일들을 바탕으로 객체 생성
        for i in self.request.FILES.getlist('images'):
            #새로운 PostFile (model.py에 있는) 객체 생성 - DB에 저장 X
            pi = PostImage()
            pi.post = p
            pi.image = i

            pi.save()

        #blog:detail 로 리다이렉트
        #새로 만들어진 Post객체의 id값으로 detail뷰의 주소 전달
        return HttpResponseRedirect(reverse('blog:detail', args=(p.id, )))
Exemple #8
0
 def form_valid(self, form):
     #Form객체 생성시 Post객체로 변환
     #why? : Post객체를 데이터베이스에 저장할 때 user변수에 값이 들어있지 않은 상태기 때문에 에러발생
     #p : 사용자입력을 바탕으로 category,title,content변수가 채워져있는 새로운 Post객체
     p = form.save(commit=False)
     #User정보를 클라이언트의 유저정보로 대입
     #즉, category,user,title,content,pub_date 5가지 변수가 있는데
     #빈칸이 없어야 함. category,title,content는 사용자가 채우고 pub_date는 자동적으로 채워지는데
     #user는 값이 들어있지 않기 때문에 commit=False로 설정해야한다.
     
     #self.request : 해당 뷰를 요청한 클라이언트의 요청정보정보가 저장된 변수
     #self.request.user : 요청한 클라이언트의 User모델클래스 객체저장변수
     p.user = self.request.user
     #데이터베이스에 Post객체 저장
     p.save()
     #사용자가 업로드한 데이터를 바탕으로 PostFile객체 생성
     #사용자가 업로드한 파일의 갯수만큼 반복
     #self.request.FILES : 사용자가 업로드한 파일을 저장한 변수
     #self.request.FILES.gestlist(name속성이름)
     #: 해당 입력공간에 업로드된 파일 데이터들을 추출
     for f in self.request.FILES.getlist('files'):
         pf = PostFile() #새로운 PostFile 객체 생성 - 데이터베이스에 저장X
         pf.post = p #새로 만들어진 Post객체와 연동
         pf.file = f #사용자가 업로드한 파일은 FileField에 저장
         pf.save()    
     #사용자가 업로드한 이미지 데이터를 바탕으로 PostImage객체 생성
     #사용자가 'images' 입력공간에 업로드한 파일들을 바탕으로 객체생성
     for i in self.request.FILES.getlist('images'):
         #새로운 PostImage객체 생성 - 데이터베이스에 저장 X
         pi = PostImage()
         pi.post = p
         pi.image = i
         pi.save()
     #blog:detail로 리다이렉트
     #새로 만들어진 Post객체의 id값으로 detail뷰의 주소 전달
     return HttpResponseRedirect(reverse('blog:detail',args=(p.id,)))
    def handle(self, *args, **options):
        posts = Post.objects.all()
        posts_without_images = [
            post for post in posts
            if not post.get_images() and not post.sponsored
        ]
        broken_dict = {}

        for p in posts_without_images:
            print "++++++++++++++++"
            print "++++++++++++++++"
            print "++++++++++++++++"
            print "working on %s" % p.id
            all_urls = p.get_all_images_from_body()
            working_urls = p.get_working_images_from_body()
            broken_urls = p.get_broken_images_from_body()
            print all_urls
            print "working: %s, broken %s" % (working_urls, broken_urls)

            soup = Soup(p.body)

            #get the working url images and save them to server
            for url in working_urls:
                img = urllib2.urlopen(url).read()

                try:
                    image_name = urlparse(url).path.split('/')[-1].replace(
                        '%', '-')
                    image_ext = image_name.split('.')[-1]
                    image_name = image_name.split('.')[0]
                    image_name = slugify(image_name)
                    image_name = image_name[:25]
                    image_name = image_name + '.' + image_ext

                    im = Image.open(StringIO.StringIO(img))
                    im.verify()

                    post_image = PostImage()
                    post_image.post = p
                    post_image._width = im.size[0]
                    post_image._height = im.size[1]
                    post_image.title = image_name

                    rhiz_media_url = 'http://media.rhizome.org/blog/%s' % p.id

                    if rhiz_media_url not in url:
                        # 'downloading and saving image to disk'
                        post_image.image.save(image_name,
                                              ContentFile(img),
                                              save=False)
                    else:
                        # 'image already on disk, saving path'
                        post_image.image = url.replace(
                            'http://media.rhizome.org/', '')
                    post_image.save()

                    soup_image = soup.findAll('img', {"src": str(url)})[0]

                    # for local testing
                    soup_image[
                        'src'] = "http://localhost:8000/media/%s" % post_image.image

                    #production
                    #soup_image['src'] = "http://media.rhizome.org/%s" % post_image.image

                except Exception, e:
                    broken_urls.append(url)

            if broken_urls:
                broken_dict[p.id] = broken_urls

            p.body = soup.prettify()
            p.save()
 def test_post_image_str(self):
     p = PostImage(name='test')
     self.assertEqual(p.name, str(p))
    def handle(self, *args, **options):
        posts = Post.objects.all()
        posts_without_images = [post for post in posts if not post.get_images() and not post.sponsored]
        broken_dict = {}

        for p in posts_without_images:
            print "++++++++++++++++"
            print "++++++++++++++++"
            print "++++++++++++++++"
            print "working on %s" % p.id
            all_urls = p.get_all_images_from_body()
            working_urls = p.get_working_images_from_body()
            broken_urls = p.get_broken_images_from_body()
            print all_urls
            print "working: %s, broken %s" % (working_urls, broken_urls)

            soup = Soup(p.body)

            #get the working url images and save them to server
            for url in working_urls:
                img = urllib2.urlopen(url).read()  
                
                try:
                    image_name = urlparse(url).path.split('/')[-1].replace('%','-')
                    image_ext = image_name.split('.')[-1]
                    image_name = image_name.split('.')[0]
                    image_name = slugify(image_name)
                    image_name = image_name[:25]
                    image_name = image_name +'.'+ image_ext

                    im = Image.open(StringIO.StringIO(img))
                    im.verify()
                    
                    post_image = PostImage()
                    post_image.post = p
                    post_image._width = im.size[0]
                    post_image._height = im.size[1]
                    post_image.title = image_name
                    
                    rhiz_media_url = 'http://media.rhizome.org/blog/%s' % p.id  

                    if rhiz_media_url not in url:
                        # 'downloading and saving image to disk'
                        post_image.image.save(image_name, ContentFile(img), save=False)
                    else:
                        # 'image already on disk, saving path'                    
                        post_image.image = url.replace('http://media.rhizome.org/','')
                    post_image.save()
                     
                    soup_image = soup.findAll('img', {"src": str(url)})[0]
                    
                    # for local testing 
                    soup_image['src'] = "http://localhost:8000/media/%s" % post_image.image
                    
                    #production 
                    #soup_image['src'] = "http://media.rhizome.org/%s" % post_image.image
                
                except Exception, e:
                    broken_urls.append(url)
            
            if broken_urls:
                broken_dict[p.id] = broken_urls

            p.body = soup.prettify()
            p.save()