Saturday, March 15, 2014

Filtering django admin inline dropdown for a foreignkey based on the parent

The original concept is explained here. But overriding the method 'formfield_for_dbfield' as in that link doesn't show up the column name. To avoid that override the 'formfield_for_foreignkey' with same logic but just build the queryset as necesssary.

Following is the snippet from my code:

class NewsBentInline(admin.TabularInline):
    model = NewsBent
           
    def __init__(self, model, admin_site, dist=False):
        self.dist = dist
        super(NewsBentInline, self).__init__(model, admin_site)
           
    def formfield_for_foreignkey(self, field, request, **kwargs):
        parent_article = self.get_object(request, Article)
        queryset = None
        if field.name == "parliament":
            if parent_article.district == 'District_name1':
                queryset = Parliament.objects.filter(dist__name="District_name1")
            else:
                queryset = Parliament.objects.all()
        if queryset is not None:
            kwargs["queryset"] = queryset
        return super(NewsBentInline, self).formfield_for_foreignkey(field, request, **kwargs)

    def get_object(self, request, model):
        object_id = request.META['PATH_INFO'].strip('/').split('/')[-1]
        return model.objects.get(pk=object_id)

Thursday, March 13, 2014

Kibana on ubuntu linux

Install Java:
sudo apt-get install openjdk-7-jre

Download logstash from http://www.elasticsearch.org/overview/logstash/.
It comes bundled with elasticsearch and kibana.

Setup/Installation instructions for crawler - scrapy for scraping pages and Django for frontend

Requirement:

Ubuntu 12.04 LTS.
Python version: 2.7.3


Setup:

sudo apt-get install python-pip
sudo pip install virtualenvwrapper

copy the following to .bashrc:
"""
export WORKON_HOME=$HOME/.virtualenvs
export PROJECT_HOME=$HOME/projects
source /usr/local/bin/virtualenvwrapper.sh
"""

mkvirtualenv crawler
workon crawler

Dependent Packages Installation:
sudo apt-get install libxml2-dev
sudo apt-get install libxslt-dev
sudo apt-get install python2.7-dev
sudo apt-get install python-scrapy
sudo apt-get install libffi-dev
pip install Scrapy

If the above packages are already available in global site packages you can use them by running following virtual env command, more info here:
toggleglobalsitepackages

mysql:
sudo apt-get install python-mysqldb
sudo apt-get install mysql-client-core-5.5
sudo apt-get install mysql-server-core-5.5
sudo apt-get install mysql-server
pip install SQLAlchemy

Django:
pip install Django==1.6.1

BeautifulSoup:
pip install beautifulsoup4

NodeJS for running javascript on terminal/commandline:
http://nodejs.org/download/

Set the environment variable:
Be careful about the ordering of paths, virtual env should be followed by system installed python
export PYTHONPATH="/home/vjonnak/.virtualenvs/crawler/local/lib/python2.7/site-packages:/usr/lib/python2.7/dist-packages"

Create the DB to support utf8 encoding:
create database news_db  DEFAULT CHARACTER SET utf8   DEFAULT COLLATE utf8_general_ci;





Adjust resolution of Oracle VM virtualbox with ubuntu

To adjust Screen resolution:

Click on 'Devices' on the virtualbox menu -> 'Insert Guest additions CD Image'
Login to Ubuntu:
Devices -> VBOXADDITIONS
On the top right end of explorer click the button "Open Autorun prompt"
Restart Ubuntu

Sunday, March 9, 2014

Extend/Reuse the power of Django Admin model


urls.py:

"""
urlpatterns = patterns('',
  url(r'articleview/$', 'myapp.views.admin_reuse'),
  url(r'^admin/', include(admin.site.urls)),
)
"""

admin.py:

"""
from myapp.models import Article

class ArticleAdmin(admin.ModelAdmin):
    <...>

admin.site.register(Article, ArticleAdmin)
"""

views.py:

"""
from django.contrib.admin.sites import AdminSite
from myapp.models import Keyword, Article
from myapp.admin import ArticleAdmin

def admin_reuse(request):
   article_admin = ArticleAdmin(Article, AdminSite(), dist)
   return article_admin.changelist_view(request)
"""

Saturday, February 22, 2014

UnicodeEncodeError exception in python

Error message:
UnicodeEncodeError: codec can't encode character  in position : ordinal not in range(128)

Python represents the string in utf-8 though the string has charachters from different encoding, hence the error message.

Scenario: Have charachters in string which are represented as string(utf-8) but has to be unicode

  • Check the type, that should tell what's the encoding:
           type(str_var)

  • If the type is 'str': you should be decoding from utf-8 to unicode:
           str_var.decode('utf-8')

  • If the type is unicode, then encode it to utf-8
           univar.encode('utf-8')

Note: if the encoding is wrong you might end up with no value if you do to avoid the exception:
          str_val.encode('ascii', 'ignore')

Refer unicode link to understand more about unicode.


Monday, February 3, 2014

Unix/Linux Shell commands

Unix/Linux Shell commands

Shortcuts

!!  (bang bang): Run entire previous command line.

    Previous command:
        $ ls -l /usr/bin/g++ /usr/bin/gcc
          -rwxr-xr-x 4 root root 221736 Oct  7  2010 /usr/bin/g++
          -rwxr-xr-x 2 root root 221920 Oct  7  2010 /usr/bin/gcc
     Shortcut:
        $ !!
           ls -l /usr/bin/g++ /usr/bin/gcc
           -rwxr-xr-x 4 root root 221736 Oct  7  2010 /usr/bin/g++
           -rwxr-xr-x 2 root root 221920 Oct  7  2010 /usr/bin/gcc

!^  (bang caret): Run just the command/program from previous command line

     Previous command:
         $ echo "contents of file1" > file1 ; echo "contents of file2" > file2
         $ ls file1 file2
            file1  file2
      Shortcut:
         $ cat !^
            cat file1
            contents of file1

!* (bang star): All arguments of previous command line

    Previous command:
         $ echo "contents of file1" > file1 ; echo "contents of file2" > file2
         $ ls file1 file2
            file1  file2
    Shortcut:
         $ head !*
            head file1 file2
            ==> file1 <==
            contents of file1

            ==> file2 <==
            contents of file2

Navigating/edit command line on terminal

Ctrl + A or Home
Moves the cursor to the start of a line.

Ctrl+ E or End
Moves the cursor to the end of a line.

Esc + B
Moves to the beginning of the previous or current word.

Ctrl + K
Deletes from the current cursor position to the end of the line.

Ctrl + U
Deletes from the start of the line to the current cursor position.

Ctrl + W
Deletes the word before the cursor.

Alt + B
Goes back one word at a time.

Alt + F
Moves forward one word at a time.

Alt + C
Capitalizes letter where cursor is and moves to end of word.

Commands

ls : list directory contents

          1. List the files by directories but not recurse with -l (minus l) flag
              ls -ld *
          2. Find timestamp of a file in seconds:
              ls -l --time-style=full-iso

Copy files across sites/machines

scp <machine name>:<source file path>  <machine name>:<Destination path>
Note: Machine name is not necessary if you are already logged into that machine

reset: Reset the terminal

  • Clears the garbled terminal with illegible characters 
locale: Displays the current locale settings

More Unix tricks here
http://lifehacker.com/5743814/become-a-command-line-ninja-with-these-time-saving-shortcuts
https://help.ubuntu.com/community/UsingTheTerminal

Settings

setenv LC_ALL C
If there are few illegible characters displayed in place of special charachters in files or man pages set the above to make them visible properly.
Learn locale here, here