বাংলায় জ্যাঙ্গো

Uncategorized

জ্যাঙ্গো সাইটে আপলোড করা ছবির নাম পরিবর্তন এবং পুর্বের ছবি পুনঃস্থাপন করা

by , on
July 31, 2016

পাইথনের ওয়েব ফ্রেমওয়ার্ক জ্যাঙ্গো ওয়েব সাইটে ছবি আপলোড করার জন্য ImageField() ব্যাবহার করা হয়।যেই ছবিটি আপলোড হয়ে settings.py ফাইলে দেখানো মিডিয়া রুট এ থাকবে এবং ছবিটি/ফাইলটি পুর্বের নামেই থাকবে। ফাইলের/ছবির নাম পরিবর্তন করতে models.py ফাইলে নিচের ফাংশন লিখে ফেলুন

# app/models.py
def imageFileRename(instance, filename):
    file_root, file_ext = os.path.splitext(filename)
    name = str(instance) + file_ext.lower()
    return name  

class Item:
      item_photo = models.ImageField(storage=OverwriteStorage(), upload_to=imageFileRename)

 

 # app/storage.py
from django.core.files.storage import FileSystemStorage
from django.conf import settings
import os

class OverwriteStorage(FileSystemStorage):

    def get_available_name(self, name):
        """Returns a filename that's free on the target storage system, and        available for new content to be written to.
        Found at http://djangosnippets.org/snippets/976/
        This file storage solves overwrite on upload problem. Another        proposed solution was to override the save method on the model        like so (from https://code.djangoproject.com/ticket/11663):
        def save(self, *args, **kwargs):            try:                this = MyModelName.objects.get(id=self.id)                if this.MyImageFieldName != self.MyImageFieldName:                    this.MyImageFieldName.delete()            except: pass            super(MyModelName, self).save(*args, **kwargs)        """        # If the filename already exists, remove it as if it was a true file system        if self.exists(name):
            os.remove(os.path.join(settings.MEDIA_ROOT, name))
        return name

Uncategorized

পাইথন জ্যাঙ্গো সাইটে HTML পেজ থেকে PDF ফাইল তৈরি করা

by , on
July 31, 2016

পাইথন রিপোর্টল্যাব( Reportlab)  লাইব্রেরী ব্যাবহার করে জ্যাঙ্গো সাইটে  পিডিএফ ফাইল তৈরি করা যায়,  কিন্তু প্রক্রিয়াটা একটু জটিল। xhtml2pdf এবং Reportlab লাইব্রেরী ব্যাবহার করে খুব সহজে html পেজ কে pdf ফাইলে রূপান্তর করা যায়।
Reportlab, xhtml2pdf, html5lib, pypdf ইন্সটল করে ফেলুন।

pip install xhtml2pdf

 

import cStringIO as StringIO
from xhtml2pdf import pisa
from django.template.loader import get_template
from django.template import Context
from django.http import HttpResponse
from cgi import escape

 

# Render pdf
def render_to_pdf(template_src, context_dict):
    template = get_template(template_src)
    context = Context(context_dict)
    html  = template.render(context)
    result = StringIO.StringIO()

    # pdf name generate with date    
    date = datetime.date.today()
    tmpName = template_src.split('.')[0]
    pdfName=tmpName + "-"+ str(date)

    pdf = pisa.pisaDocument(StringIO.StringIO(html.encode("ISO-8859-1")), result)
    
    if not pdf.err:
        response = HttpResponse(result.getvalue(), content_type='application/pdf')
        response['Content-Disposition'] = 'attachment; filename='+pdfName+'.pdf'        
        return response
    return HttpResponse('We had some errors<pre>%s</pre>' % escape(html))

 

উপরের অংশ আপনার views.py ফাইলে যুক্ত করুন।

date = datetime.date.today()
tmpName = template_src.split(‘.’)[0]
pdfName=tmpName + “-“+ str(date)

এই অংশ দ্বারা ফাইলের নাম তৈরি করবে। আমি টেমপ্লেটের নামের সাথে পাইথনের ডেটটাইম মডিউল ব্যাবহার করে আজকের দিনের তারিখ  যুক্ত করে ফাইলের নাম তৈরি করেছি। অর্থাৎ , template-name-2016-05-20.pdf

response['Content-Disposition'] = 'attachment; filename='+pdfName+'.pdf'

অংশটি ফাইলের নাম তৈরি করবে।

def myVewFuntion(request):
    posts = Post.objects.all()
    context = {'posts':posts} 
    return render_to_pdf( 'allposts.html',context )

আপনার view ফাংশনে  render_to_pdf রিটার্ন করুন.একটই এইচটিএমএল ফাইল তৈরি করুন। উল্লেখ্য এখানে ইনলাইন  CSS ব্যাবহার করতে হবে। অন্য ফাইল থেকে সংযুক্ত CSS এখানে কাজ করবে না। তাই আপনার Html ফাইলের মধ্যেই স্টাইল কোড লিখতে হবে।

 ##  allposts.html
<!DOCTYPE html>
 <html lang="en">
 <head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<style>*{margin:0;padding:0;}
.bg{
 width: 100%;
 background-color:#dcdcdc;
}

table {
border-spacing: 0;
border-collapse: separate;
}
.thead td{
  font-weight: bold;
  color:blue;
}
.red
{
  color:red;
  font-weight: bold;
}
.green {
  color:green;
  font-weight: bold;
}
.logo{
  height: 70px;
  width: 60px;
}

.foot{
    border-top: 1px solid black;
}
</style></head>
<body >
{% if posts %}
<div id="admit"> 
    <table class="bg"> 
        <tr> 
            <td class="righthead"> 
                <img class="logo" src="./media/harun.png"> 
                <h1>Harun Or Rashid</h1>            
             </td>
        </tr>
     </table>
     <table class="footer"> 
         <td><strong>@Developed by Harun</strong></td>        
         </tr>
      </table> 
    {% endif %}
    </body>
</html>