#!@PYTHON@
#
# Copyright (C) 2002
#
# This file is part of the email2trac utils
#
# This program is free software; you can redistribute it and/or modify it 
# under the terms of the GNU General Public License as published by the
# Free Software Foundation; either version 2, or (at your option) any
# later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA
#
# vi:
#	set ts=4
"""
Author: Bas van der Vlies
Date  : 29 September 2205
Desc. : Delete Spam tickets from database. Else we get an lot of 
        tickets

Usage :
	delete_spam [ -f/--file <configfile>  -n/--dry-run -p/--project <name> -v/--verbose]

defaults:
	configfile = /etc/email2trac.conf

SVN Info:
        $Id: delete_spam.py.in 374 2010-06-09 15:15:07Z bas $
"""

import os
import sys
import getopt
import shutil
import ConfigParser

from trac import __version__ as trac_version

def ReadConfig(file, name):
	"""
	Parse the config file
	"""

	if not os.path.isfile(file):
		print 'File %s does not exists' %file
		sys.exit(1)

	config = ConfigParser.ConfigParser()
	try:
		config.read(file)
	except ConfigParser.MissingSectionHeaderError,detail:
		print detail
	  	sys.exit(1)

  	# Use given project name else use defaults
  	#
	if name:
		if not config.has_section(name):
			print "Not an valid project name: %s" %name
			print "Valid names: %s" %config.sections()
			sys.exit(1)

		project =  dict()
		for option in  config.options(name):
			project[option] = config.get(name, option) 

	else:
		project = config.defaults()

	return project



def new_delete_spam(parameters):
	"""
	This only works for trac versions higher or equal then 0.10
	"""

	debug = int(parameters['debug'])
	DRY_RUN = parameters['DRY_RUN']
	VERBOSE = parameters['VERBOSE']

	project = parameters['project']


	env = Environment(project, create=0)
	db = env.get_db_cnx()

	cursor = db.cursor()
	cursor.execute("SELECT id FROM ticket WHERE  component = 'Spam';") 
	while 1: 
		row = cursor.fetchone()
		if not row:
			break 

		spam_id =  row[0]

		if debug or DRY_RUN or VERBOSE:
			print "Deleting ticket %s" %spam_id

		try:
			tkt = Ticket(env, spam_id, db)
		except util.TracError, detail:
		        print detail
			continue

		if DRY_RUN:
			print 'DRY_RUN: tkt.delete()'
		else:
			tkt.delete()

if __name__ == '__main__':
	# Default config file
	#
	configfile = '@email2trac_conf@'


	try:
		 opts, args = getopt.getopt(sys.argv[1:], 'hf:np:v', ['help', 'file=', 'dry-run', 'project=', 'verbose'])
	except getopt.error,detail:
		print __doc__
		print detail
		sys.exit(1)

	DRY_RUN = False
	VERBOSE = False
	project_name = None

	for opt,value in opts:
		if opt in [ '-h', '--help']:
			print __doc__ 
			sys.exit(0) 
		elif opt in ['-f', '--file']:
			configfile = value
		elif opt in ['-n', '--dry-run']:
			DRY_RUN = True
		elif opt in ['-p', '--project']:
			project_name = value
		elif opt in ['-v', '--verbose']:
			VERBOSE = True

	# Determine major trac version used to be in email2trac.conf
	# Quick hack for 0.12
	#
	version = '0.%s' %(trac_version.split('.')[1])
	if version.startswith('0.12'):
		version = '0.12'

	if VERBOSE:
		print "Found trac version: %s" %version

	## We only support versions 0.11 and 0.12
	#
	if not version in ['0.11', '0.12']:
		print 'Trac version %s is not suported' %(version)

	settings = ReadConfig(configfile, project_name)
	if not settings.has_key('project'):
		print __doc__
		print 'No project defined in config file, eg:\n\t project: /data/trac/bas'
		sys.exit(1)

	settings['DRY_RUN'] = DRY_RUN
	settings['VERBOSE'] = VERBOSE

	from trac.env import Environment
	from trac.ticket import Ticket
	from trac import util



	new_delete_spam(settings)

	print 'Spam is deleted succesfully..' 
# EOB
