Source code for polygon.reader
######################################
#     Created on Jun 15, 2015
#
#     @author: nqian
#     @author: Grant Mercer
######################################
# import antigravity
import ast
import json
import constants
from constants import PLOTS
from log.log import logger
from polygon.shape import Shape
from tools.tools import byteify
from db import db
[docs]class ShapeReader(object):
    """
    Reads JSON files and transfers the data into PolygonDrawer objects
    :param str filename: Internal filename to write to
    """
    def __init__(self, filename=''):
        """
        Initializes attributes
        """
        self.filename = filename
        self.__data = {}
[docs]    def set_filename(self, filename):
        """
        Sets the file name destination
        :param str filename: the name of the file
        """
        self.filename = filename 
        
[docs]    def read_from_file_json(self):
        """
        Reads the data from the JSON file
        """
        with open(self.filename, 'r') as infile:
            data = byteify(json.load(infile))
        self.__data = data	
        return self.__data 
        
[docs]    def read_from_str_json(self, data):
        """
        Reads JSON as a string
        :param str data: string representation of a JSON object
        """
        self.__data = byteify(json.loads(data))
        keys = [x for x in self.__data if x in constants.plot_type_enum.keys()]
        if not keys:
            logger.error("Invalid JSON plot keys passed, you WILL get some error after this eventually...")
        for plt in keys:
            for shape in self.__data[plt]:
                if 'coordinates' in self.__data[plt][shape]:
                    self.__data[plt][shape]['coordinates'] = \
                        
[[x[0], x[1]] for x in ast.literal_eval(
                            self.__data[plt][shape]['coordinates']) if len(x) == 2]
                if 'attributes' in self.__data[plt][shape]:
                    self.__data[plt][shape]['attributes'] = \
                        
ast.literal_eval(self.__data[plt][shape]['attributes'])
        return self.__data 
[docs]    def pack_shape(self, shape_list, plot_type, canvas, read_from_str=None):
        """
        Stores the data in the JSON into PolygonDrawers
        :param shape_list: a Python list of PolygonDrawers
        :param plot_type: the current plot being displayed
        :param canvas: a Tkinter canvas to initialize the blank PolygonDrawer in the shape_list
        """
        from polygon.manager import ShapeManager
        enum_plot_type = constants.plot_type_enum[plot_type]
        try:
            for shape in self.__data[plot_type]:
                entry = self.__data[plot_type][shape]['id']
                if entry is not None and int(entry) in [x.get_id() for x in shape_list]:
                    continue
                logger.info('Found data in %s, packing polygon with JSON data'
                        % PLOTS[enum_plot_type])
                color = self.__data[plot_type][shape]['color']
                #fl = self.__data['hdffile']
                coordinates = self.__data[plot_type][shape]['coordinates']
                attributes = self.__data[plot_type][shape]['attributes']
                notes = self.__data[plot_type][shape]['notes']
                _id = self.__data[plot_type][shape]['id']
                if db.exists_tag(shape) and not read_from_str:
                    new = ShapeManager.generate_tag()
                    logger.warning(
                        'Shape tag already exists in database, creating new tag % s'
                        % new)
                    shape_list[-1].set_tag(new)
                else:
                    shape_list[-1].set_tag(shape)
                shape_list[-1].set_id(_id)
                shape_list[-1].set_color(color)
                shape_list[-1].set_plot(enum_plot_type)
                #shape_list[-1].set_hdf(fl)
                shape_list[-1].set_attributes(attributes)
                shape_list[-1].set_coordinates(coordinates)
                shape_list[-1].set_notes(notes)
                shape_list[-1].save()
                shape_list.append(Shape(canvas))
        except KeyError:
            logger.error('Bad data in JSON file')