Joff
Joff

Reputation: 12197

Where to put this class in django?

I have a class for data entry that requires a lot of input from the user. I use it to semi-automate the process of putting stuff in the db where it is possible.

My instinct is to put it in my model classes, and write tests on it, but it would be an insane amount of work, and I have a lot of raw_input() functions and logic loops that I don't know how to test or what to do with.

Should I keep this module separate or try to include it in the model classes?

def define(self, word=False, word_pk=False):
    '''Defining a word, there may be language specific elements to edit in here'''
    try:
        if word_pk:
            word = Word.objects.get(id=word_pk)
        else:
            word = Word.objects.get(language__name=self.language_ISO, name=word)
    except:
        return "Word lookup failed for word=%s word_pk=%s\n" % (word, word_pk)

    print "\n\tThe Word is: '%s'...\n" % (word) 
    wiktionary_list = word.wiktionary_lookup(self.wiktionary_prefix, self.driver)
    wn_tuple = word.wn_lookup()
    while choice("Would you like to add a/another definition for '%s'?: " % word):
        #Ask the user if they want to use the wn output for definitions, make them select which ones
        if choice("Would you like to choose a wordnet definition?: "):
            chosen_defs = ask_input("Which ones? (choose all that apply with a space between numbers): ")
            chosen_defs = [int(i) for i in (chosen_defs.split())]
            #Wornet only gives part of speech and definition information so I need to split that here. 
            for i in chosen_defs:
                #Print_n_save function will return False if it exits successfully, so there is an option to repeat this loop if the user makes a mistake somewhere 
                repeat = True
                while repeat:
                    tup = wn_tuple[i]
                    print "\n(%s) - %s\n" % (tup[0], tup[1])
                    audio_tup = self.add_audio(word)
                    picture_tup = self.add_picture(word)

                    new_definition = Definition()
                    new_definition.word=word
                    new_definition.part_speech= tup[0]
                    new_definition.definition=tup[1]
                    new_definition.def_source="Wordnet"
                    new_definition.add_pronunciation()
                    new_definition.word_audio=audio_tup[0]
                    new_definition.audio_source=audio_tup[1]
                    new_definition.picture=picture_tup[0]
                    new_definition.pic_source=picture_tup[1]

                    repeat = self.print_n_save(new_definition)

        elif choice("Would you like to choose a wiktionary definition?: "):

            choose_defs = ask_input("Which ones would you like to choose? (Numbers separated by spaces): ")
            chosen_defs = [int(i) for i in choose_defs.split()]

            for i in chosen_defs:
                #Print_n_save function will return False if it exits successfully, so there is an option to repeat this loop if the user makes a mistake somewhere
                repeat = True
                while repeat:
                    print "\n%s\n" % (wiktionary_list[i])
                    audio_tup = self.add_audio(word)
                    picture_tup = self.add_picture(word)

                    new_definition = Definition()
                    new_definition.word=word
                    new_definition.get_pos()
                    new_definition.definition=wiktionary_list[i]
                    new_definition.def_source="Wiktionary"
                    new_definition.add_pronunciation()
                    new_definition.word_audio=audio_tup[0]
                    new_definition.audio_source=audio_tup[1]
                    new_definition.picture=picture_tup[0]
                    new_definition.pic_source=picture_tup[1]

                    repeat = self.print_n_save(new_definition)

        else:
            #Print_n_save function will return False if it exits successfully, so there is an option to repeat this loop if the user makes a mistake somewhere
            repeat = True
            while repeat:
                #Asking for definition, inputting raw from some internet source
                definition = ask_input("What is the definition?: ")
                definition_source = ask_input("What is the source of the definition?: ")
                audio_tup = self.add_audio(word)
                picture_tup = self.add_picture(word)

                new_definition = Definition()
                new_definition.word=word
                new_definition.get_pos()
                new_definition.definition=definition
                new_definition.def_source=definition_source
                new_definition.add_pronunciation()
                new_definition.word_audio=audio_tup[0]
                new_definition.audio_source=audio_tup[1]
                new_definition.picture=picture_tup[0]
                new_definition.pic_source=picture_tup[1]

                repeat = self.print_n_save(new_definition)

Upvotes: 0

Views: 82

Answers (2)

Todor
Todor

Reputation: 16050

I would put this into management/commands. Just wrap your functions into a BaseCommand class and you are good to go. And here is how to make testing.

Upvotes: 2

Sayse
Sayse

Reputation: 43330

Don't try to force a raw python function into a single box.

What you should have done (a long long time ago), is separate it out into separate functions so it would be easier to test and figure things out.

Since you're asking for user input, websites do that through forms, so you're going to need a form - or a form wizard/set/whatever.

That form is going to need at least one view to handle it, so you might need to write that too, or use a generic view.

Who knows, the model might even need to do something post processing (I didn't really read the code)

Upvotes: 2

Related Questions