Agenda de compromissos

Publicado por Alexis Huf 04/09/2006

[ Hits: 10.826 ]

Download compromissos.py




Esse script armazena compromissos usando arquivos texto como banco de dados. Ele permite pesquisar, listar, remover e visualizar entradas. A função 3 só funciona em POSIX e Windows.

  



Esconder código-fonte

#!/usr/bin/python
# -*- coding: utf-8 -*-
#Programa que grava os compromissos, usa um arquivo de texto como 'bd'
### --- imports --- ###
import os
import time
from sys import exit
### --- defs --- ###
def adi():
   if OS == 'posix' or OS == 'nt':
      os.system(clear)
   nome = raw_input('Nome do compromisso: ')
   if nome == '':
      opc = raw_input('Não é recomendável deixar o nome do compromisso em branco, tem certeza de que deseja fazer isso? (s/N) ')
      if opc == 'S':
         time.sleep(0.5)
      elif opc == 's':
         time.sleep(0.5)
      else:
         menu()
   descr = raw_input('Descrição do compromisso: ')
   data = raw_input('Data do compromisso (dd/mm/aaaa): ')
   if len(data) != 10:
      print 'Você forneceu uma data inválida, use o formato "dd/mm/aaa" !'
      time.sleep(1.5)
      menu()
   dd = data[0:2]
   mm = data[3:5]
   aaaa = data[6:10]
   arqnome = dd + '-' + mm + '-' + aaaa + ' - ' + nome
   entradas = os.listdir(dir_dados)
   if arqnome in entradas:
      opc = raw_input('ATENÇÃO!!! Já existe uma entrada %s deseja sobreescreve-la? (s/N) ' % arqnome)
      if opc == 'S':
         time.sleep(0.5)
      elif opc == 's':
         time.sleep(0.5)
      else:
         adi()
   arq = open(arqnome,'a')
   arq.write(descr)
   arq.close()
   print '---'
   print 'Entrada adicionada com sucesso!'
   enter = raw_input('(Pressione ENTER para continuar)')
   menu()
# def rem():
#    if OS == 'posix' or OS == 'nt':
#       os.system(clear)
#    f = 0
#    entradas = os.listdir(dir_dados)
#    n_entradas = len(entradas)
#    if n_entradas < 1:
#       print 'Você não tem nenhuma entrada de compromisso gravada.'
#       menu()
#    elif n_entradas > 1:
#       print 'Compromissos:\n'
#       entradas.sort()
#       for n in entradas:
#          print n
#       print '\n'
#       nome = raw_input('Digite o nome por completo do compromisso que você deseja remover: ')
#       
#    elif n_entradas == 1:
#       nome = entradas[0]
#       print 'Só há o compromisso %s' % nome
#    opc = raw_input('Tem certeza que deseja remover o compromisso %s? (s/N)' % nome)
#    if opc == 'S' or opc == 's':
#       try:
#          os.remove(nome)
#       except OSError:
#          print 'A entrada %s não existe' % nome
#          f = 1
#       if f == 0:
#          print ' '
#          print 'A entrada foi removida com sucesso'
#    else:
#       time.sleep(0.5)
#    enter = raw_input('(Pressione ENTER para continuar)')
#    f = 0
#    menu()
def listar():
   f = 0
   if OS == 'posix' or OS == 'nt':
      os.system(clear)
   entradas = os.listdir(dir_dados)
   entradas.sort()
   if entradas == []:
      print 'Não há nenhuma entrada armazenada!'
      time.sleep(1.5)
      menu()
   print 'Compromissos:'
   for n in entradas:
      print n
   print '---'
   nome = raw_input('Qual é a entrada que você deseja ver ou remover? ')
   entradas = os.listdir(dir_dados)
   nomes = []
   nomesc = []
   for n in entradas:
      no = n
      n = n[13:]
      if n == nome:
         nomes.append(n)
         nomesc.append(no)
   vezes = nomes.count(nome)
   if vezes == 0:
      print 'Ops, a entrada que você forneceu não é válida'
      enter = raw_input('(Pressione ENTER para continuar)')
      menu()
   elif vezes == 1:
      nome = nomesc[0]
      print nome
   else:
      for n in nomesc:
         print n
      print '---'
   vr = raw_input('Deseja ver ou remover essas entradas? (V/r) ')
   if vr == 'R' or vr == 'r':
      try:
         for n in nomesc:
            os.remove(n)
      except OSError:
         print 'As entradas não existem'
         f = 1
      if f == 0:
         print ' '
         print 'As entradas foram removidas com sucesso!'
   else:   
      try:
         arq = open(nome,'r')
         descr = arq.read()
      except IOError:
         print 'Ops, a entrada que você forneceu não é válida'
         enter = raw_input('(Pressione ENTER para continuar)')
         menu()
      print ' '
      print '--- %s ---' % nome
      print '%s' % descr
      print '--- %s ---' % nome
      print ' '
   enter = raw_input('(Pressione ENTER para continuar)')
   menu()
def proc():
   f = 0
   if OS == 'posix' or OS == 'nt':
      os.system(clear)
   os.chdir(dir_dados)
   if OS == 'posix' or OS == 'nt':
      string = raw_input('Digite algo para pesquisar: ')
      if string == '':
         print 'Você DEVE digitar algo se quer fazer uma pesquisa!'
         time.sleep(2)
         menu()
      elif OS == 'posix':
         com = 'ls | grep ' + string + ' &> listagem-compromissos.tmp'
         erro = ''
      elif OS == 'nt': 
         com = 'dir /B' + ' | find "' + string + '" > listagem-compromissos.tmp'
         erro = ''
      os.system(com)
      resultadoa = open('listagem-compromissos.tmp','r')
                resultados = resultadoa.read()
      resultadoa.close()
      resultadoa = open('listagem-compromissos.tmp','r')
      resultado = resultadoa.readlines()
      if resultados == erro:
         resultadoa.close()
         os.remove('listagem-compromissos.tmp')
         print 'Sua busca não retornou nenhum resultado'
         enter = raw_input('(Pressione ENTER para continuar)')
         proc()
      else:
         resultadoa.close()
         os.remove('listagem-compromissos.tmp')
         print ' '
         for n in resultado:
            print n
         ent = raw_input('Qual é a entrada que deseja ver? ')
         ent = ent + '\n'
         ents = []
         entsc = []
         for n in resultado:
            no = n[:-1]
            n = n[13:]
            if n == ent:
               ents.append(n)
               entsc.append(no)
         vezes = ents.count(ent)
         if vezes == 0:
            print 'Ops, a entrada que você forneceu não é válida'
            enter = raw_input('(Pressione ENTER para continuar)')
            menu()
         elif vezes == 1:
            ent = entsc[0]
         else:
            for n in entsc:
               print n
            ent = raw_input('Escolha uma entrada digitando-a por completo: ')
         vr = raw_input('Você deseja ver a descrição do compromisso ou remove-lo? (V/r) ')
         if vr == 'r' or vr == 'R':
            try:
               os.remove(ent)
            except OSError:
               print 'A entrada %s não existe' % ent
               f = 1
            if f == 0:
               print ' '
               print 'A entrada foi removida com sucesso'
         else:
            try:
               arq = open(ent,'r')
               descr = arq.read()
               arq.close
            except IOError:
               print 'Ops, a entrada que você forneceu não é válida'
               enter = raw_input('(Pressione ENTER para continuar)')
               menu()
            print ' '
            print '--- %s ---' % ent
            print descr
            print '--- %s ---' % ent
   else:
      print 'Desculpe, mas essa função só está disponível para sistemas posix e nt, você vai ter que usar a opção "Listar Todas as Entradas"'
   print ' '
   enter = raw_input('(Pressione ENTER para continuar)')
   menu()
def ajuda():
   if OS == 'posix' or OS == 'nt':
         os.system(clear)
   print ' --- Ajuda --- '
   print '''Sobre o que você gostaria de obter ajuda?
   1. Adicionar uma entrada
   2. Listar Todas as entradas
   3. Pesquisar Uma entrada 
   0. Voltar ao menu principal'''
   opc = raw_input(' >> ')
   if opc == '1':
      if OS == 'posix' or OS == 'nt':
         os.system(clear)
      print '''
   Essa função vai adicionar uma entrada ao "banco de dados", ou seja, ela vai criar um arquivo correspondente a entrada na pasta "dados-compromissos". Esse arquivo vai ter como nome a data do compromisso seguida do nome do mesmo (dd-mm-aaaa - nome). O nome do compromisso pode conter quaisquer carecteres que você usaria para dar nomes de arquivos no sistema operacional que você está usando, no windows você não deve usar caracteres como \ / : * ? " " < > | e  em sistemas posix não há restrições, mas em ambos não é recomendável usar esses caracteres e outros como ; & % $ # [] etc.
   Em ambos os sistemas você pode usar espaços e acentos sem maiores preocupações.
   O campo de descrição não é de preenchimento obrigatório, seu conteúdo será gravado dentro do arquivo, e você pde usar qualquer caractere.
   O campo da data deve ser obrigatoriamente preenchido, e no formato dd/mm/aaaa, você pode trocar a barra por qualquer outro caractere como - + = ou até letras comuns, mas deve ser usado UM caractere como separa dor e sempre dois digitos para dia e mês e quatro para o ano, o 0 deve ser usado no caso de números menores de 10.'''
      print ' '
      enter = raw_input('(Pressione ENTER para continuar)')
      ajuda()
   elif opc == '2':
      if OS == 'nt' or OS == 'posix':
         os.system(clear)
      print '''
   Essa função vai ler todas as entradas armazenadas e mostrar uma lista. Você pode escolher qualquer opção digitando o nome do compromisso (sem a data precedendo) e a função vai procurar todos os nomes exatamente iguais, ou seja a função é CaSeSeNsItIvE e dd é diferente de DD e de ddd! Uma vez exibidas as entradas combinadas, você será questionado se quer ver todas as entradas exibidas ou se quer remove-las. Tome cuidado com a ultima opção, ela é irreversível. Caso você selecione "Ver", todas as entradas serão exibidas sequêncialmente no seguinte formato:
      --- entrada ---
      descrição da entrada
      --- entrada ---
   Se você selecionar a opção remover as entradas serão apagadas para sempre.'''
      print ' '
      enter = raw_input('(Pressione ENTER para continuar)')
      ajuda()
   elif opc == '3':
      if OS == 'nt' or OS == 'posix':
         os.system(clear)
      print '''
   Essa função está disponível apenas para sistemas Windows (tm) e posix, ela vai usar os utilitários de listagem "DIR" no Windows e "ls" nos de padrão posix.
   Ao escolher essa opção você deverá digitar alguyma coisa para pesquisar, essa função é CaSeSeNsItIvE e irá procurar por ocorrências do valor digitado em qualquer lugar do nome do arquivo da entrada, que é composto por "data - nome". Depois ela irá exibir uma lista das entradas que contém o valor digitado. Caso haja mais de um resultado, você terá de informar a entrada desejada digitand-a por completo, incuisive a data, caso haja apenas uma entrada, isso não será necessário. Depois você será questionado se deseja ver o conteúdo da entrada ou se deseja remove-la. Caso você selecione "Ver", todas aentrada será exibida no seguinte formato:
      --- entrada ---
      descrição da entrada
      --- entrada ---
   Se você selecionar a opção remover a entrada será apagada para sempre.'''
      print ' '
      enter = raw_input('(Pressione ENTER para continuar)')
      ajuda()
   elif opc == '0':
      menu()
   else:
      print 'Opção inválida'
      time.sleep(1.5)
      ajuda()
def menu():
   if OS == 'posix' or OS == 'nt':
         os.system(clear)
   print '''Escolha uma opção:
   1. Adicionar uma entrada
   2. Listar Todas as entradas
   3. Pesquisar Uma entrada
   4. Ajuda
   0. Sair'''
   opc = raw_input('>> ')
   if opc == '1':
      adi()
   elif opc == '2':
      listar()
   elif opc == '3':
      proc()
   elif opc == '4':
      ajuda()
   elif opc == '0':
      if OS == 'posix' or OS == 'nt':
         os.system(clear)
      exit()
   else:
      while opc != '1' and opc != '0':
         print 'Você digitou uma opção inválida!'
         time.sleep(1.5)
         menu()

### --- nucleo --- ###
cont = 0
dir_prin = os.getcwd()
OS = os.name
if OS == 'nt':
   clear = 'cls'
elif OS == 'posix':
   clear = 'clear'
try:
   os.chdir('dados-compromissos')
except OSError:
   os.mkdir('dados-compromissos')
   os.chdir('dados-compromissos')
dir_dados = os.getcwd()
menu()
                   

Scripts recomendados

Dividir um grupo de arquivos em vários CDs Ou DVDs

ccl - cut and change lines

Conversor de Python para .exe

Manipulando arquivos com Pickle

Serialização em Python usando pickle


  

Comentários
[1] Comentário enviado por _luks em 04/09/2006 - 14:09h

uma dica:
se o meu compromisso fosse hoje (4/7/06) as 16:00, como eu saberia isso ?
tente adcionar isso :)


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts