~erobererunc/sahana-eden/tropo_xforms

« back to all changes in this revision

Viewing changes to models/00_utils.py

  • Committer: Michael
  • Date: 2010-12-16 13:45:28 UTC
  • mfrom: (1479.1.91 eden)
  • Revision ID: ero@gmail.com-20101216134528-7x3m6m3fk9uc9i69
mergeĀ fromĀ trunk...

Show diffs side-by-side

added added

removed removed

Lines of Context:
33
33
                        _memberships.group_id)
34
34
        roles = [m.group_id for m in memberships]
35
35
    session.s3.roles = roles
 
36
    if not auth.permission():
 
37
        auth.permission.fail()
36
38
 
37
39
    # Are we running in debug mode?
38
40
    session.s3.debug = request.vars.get("debug", None) or \
144
146
 
145
147
    offset = IS_UTC_OFFSET.get_offset_value(session.s3.utc_offset)
146
148
 
147
 
    if offset:
 
149
    if not value:
 
150
        return "-"
 
151
    elif offset:
148
152
        dt = value + datetime.timedelta(seconds=offset)
149
153
        return dt.strftime(str(format))
150
154
    else:
229
233
 
230
234
        Designed to be called from a postp
231
235
 
232
 
        @note: standard action buttons will be inserted automatically
233
 
 
 
236
        @note: standard action buttons will be inserted automatically unless already overridden
234
237
    """
235
238
 
236
239
    if r.component:
493
496
    for table in db.tables:
494
497
        count = 0
495
498
        for field in db[table].fields:
496
 
            if db[table][field].type == "reference %s" % reference:
 
499
            if str(db[table][field].type) == "reference %s" % reference:
497
500
                if count == 0:
498
501
                    tables[table] = {}
499
502
                tables[table][count] = field
697
700
 
698
701
 
699
702
# -----------------------------------------------------------------------------
700
 
def shn_search(r, **attr):
701
 
 
702
 
    """ Search function, mostly used with the JSON representation
703
 
 
704
 
        used as method handler for S3Resources
705
 
 
706
 
        @todo: replace by a S3MethodHandler
707
 
 
708
 
    """
709
 
 
710
 
    deletable = attr.get("deletable", True)
711
 
    main = attr.get("main", None)
712
 
    extra = attr.get("extra", None)
713
 
 
714
 
    request = r.request
715
 
 
716
 
    # Filter Search list to just those records which user can read
717
 
    query = shn_accessible_query("read", r.table)
718
 
 
719
 
    # Filter search to items which aren't deleted
720
 
    if "deleted" in r.table:
721
 
        query = (r.table.deleted == False) & query
722
 
 
723
 
    # Respect response.s3.filter
724
 
    if response.s3.filter:
725
 
        query = response.s3.filter & query
726
 
 
727
 
    if r.representation in shn_interactive_view_formats:
728
 
 
729
 
        shn_represent(r.table, r.prefix, r.name, deletable, main, extra)
730
 
        search = t2.search(r.table, query=query)
731
 
        #search = crud.search(r.table, query=query)[0]
732
 
 
733
 
        # Check for presence of Custom View
734
 
        shn_custom_view(r, "search.html")
735
 
 
736
 
        # CRUD Strings
737
 
        title = s3.crud_strings.title_search
738
 
 
739
 
        output = dict(search=search, title=title)
740
 
 
741
 
    elif r.representation == "json":
742
 
 
743
 
        _vars = request.vars
744
 
        _table = r.table
745
 
 
746
 
        # JQuery Autocomplete uses "q" instead of "value"
747
 
        # JQueryUI Autocomplete uses "term" instead of "value"
748
 
        value = _vars.value or _vars.term or _vars.q or None
749
 
 
750
 
        if _vars.field and _vars.filter and value:
751
 
            field = str.lower(_vars.field)
752
 
            _field = _table[field]
753
 
 
754
 
            # Optional fields
755
 
            if "field2" in _vars:
756
 
                field2 = str.lower(_vars.field2)
757
 
            else:
758
 
                field2 = None
759
 
            if "field3" in _vars:
760
 
                field3 = str.lower(_vars.field3)
761
 
            else:
762
 
                field3 = None
763
 
            if "parent" in _vars and _vars.parent:
764
 
                if _vars.parent == "null":
765
 
                    parent = None
766
 
                else:
767
 
                    parent = int(_vars.parent)
768
 
            else:
769
 
                parent = None
770
 
            if "exclude_field" in _vars:
771
 
                exclude_field = str.lower(_vars.exclude_field)
772
 
                if "exclude_value" in _vars:
773
 
                    exclude_value = str.lower(_vars.exclude_value)
774
 
                else:
775
 
                    exclude_value = None
776
 
            else:
777
 
                exclude_field = None
778
 
                exclude_value = None
779
 
 
780
 
            limit = int(_vars.limit or 0)
781
 
 
782
 
            filter = _vars.filter
783
 
            if filter == "~":
784
 
                if field2 and field3:
785
 
                    # pr_person name search
786
 
                    if " " in value:
787
 
                        value1, value2 = value.split(" ", 1)
788
 
                        query = query & ((_field.like("%" + value1 + "%")) & \
789
 
                                        (_table[field2].like("%" + value2 + "%")) | \
790
 
                                        (_table[field3].like("%" + value2 + "%")))
791
 
                    else:
792
 
                        query = query & ((_field.like("%" + value + "%")) | \
793
 
                                        (_table[field2].like("%" + value + "%")) | \
794
 
                                        (_table[field3].like("%" + value + "%")))
795
 
 
796
 
                elif exclude_field and exclude_value:
797
 
                    # gis_location hierarchical search
798
 
                    # Filter out poor-quality data, such as from Ushahidi
799
 
                    query = query & (_field.like("%" + value + "%")) & \
800
 
                                    (_table[exclude_field] != exclude_value)
801
 
 
802
 
                elif parent:
803
 
                    # gis_location hierarchical search
804
 
                    # NB Currently not used - we allow people to search freely across all the hierarchy
805
 
                    # SQL Filter is immediate children only so need slow lookup
806
 
                    #query = query & (_table.parent == parent) & \
807
 
                    #                (_field.like("%" + value + "%"))
808
 
                    children = gis.get_children(parent)
809
 
                    children = children.find(lambda row: value in str.lower(row.name))
810
 
                    item = children.json()
811
 
                    query = None
812
 
 
813
 
                else:
814
 
                    # Normal single-field
815
 
                    query = query & (_field.like("%" + value + "%"))
816
 
 
817
 
                if query:
818
 
                    if limit:
819
 
                        item = db(query).select(limitby=(0, limit)).json()
820
 
                    else:
821
 
                        item = db(query).select().json()
822
 
 
823
 
            elif filter == "=":
824
 
                query = query & (_field == value)
825
 
                if parent:
826
 
                    # e.g. gis_location hierarchical search
827
 
                    query = query & (_table.parent == parent)
828
 
 
829
 
                if _table == db.gis_location:
830
 
                    # Don't return unnecessary fields (WKT is large!)
831
 
                    item = db(query).select(_table.id, _table.uuid, _table.parent, _table.name, _table.level, _table.lat, _table.lon, _table.addr_street).json()
832
 
                else:
833
 
                    item = db(query).select().json()
834
 
 
835
 
            elif filter == "<":
836
 
                query = query & (_field < value)
837
 
                item = db(query).select().json()
838
 
 
839
 
            elif filter == ">":
840
 
                query = query & (_field > value)
841
 
                item = db(query).select().json()
842
 
 
843
 
            else:
844
 
                item = s3xrc.xml.json_message(False, 400, "Unsupported filter! Supported filters: ~, =, <, >")
845
 
                raise HTTP(400, body=item)
846
 
 
847
 
        else:
848
 
            #item = s3xrc.xml.json_message(False, 400, "Search requires specifying Field, Filter & Value!")
849
 
            #raise HTTP(400, body=item)
850
 
            # Provide a simplified JSON output which is in the same format as the Search one
851
 
            # (easier to parse than S3XRC & means no need for different parser for filtered/unfiltered)
852
 
            if _table == db.gis_location:
853
 
                # Don't return unnecessary fields (WKT is large!)
854
 
                item = db(query).select(_table.id, _table.name, _table.level).json()
855
 
            else:
856
 
                item = db(query).select().json()
857
 
 
858
 
        response.view = "xml.html"
859
 
        output = dict(item=item)
860
 
 
861
 
    else:
862
 
        raise HTTP(501, body=BADFORMAT)
863
 
 
864
 
    return output
865
 
 
866
 
 
867
 
# -----------------------------------------------------------------------------
868
703
def shn_barchart (r, **attr):
869
704
 
870
705
    """ Provide simple barcharts for resource attributes
1002
837
 
1003
838
    """
1004
839
 
1005
 
    # Set method handlers
1006
 
    s3xrc.set_handler("search", shn_search)
1007
 
    s3xrc.set_handler("copy", shn_copy)
1008
 
    s3xrc.set_handler("barchart", shn_barchart)
1009
 
 
1010
840
    # Parse and execute the request
1011
841
    resource, r = s3xrc.parse_request(prefix, resourcename)
 
842
 
 
843
    resource.set_handler("search", _s3xrc.S3Search(s3xrc))
 
844
    resource.set_handler("copy", shn_copy)
 
845
    resource.set_handler("barchart", shn_barchart)
 
846
 
1012
847
    output = resource.execute_request(r, **attr)
1013
848
 
1014
 
    # Add default action buttons in list views
1015
849
    if isinstance(output, dict) and not r.method or r.method=="search_simple":
1016
 
 
1017
850
        if response.s3.actions is None:
1018
851
 
 
852
            # Add default action buttons
1019
853
            prefix, name, table, tablename = r.target()
1020
854
            authorised = shn_has_permission("update", tablename)
1021
855