<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>app/controllers/group_permissions_controller.rb</filename>
    </added>
    <added>
      <filename>app/controllers/groupphotos_controller.rb</filename>
    </added>
    <added>
      <filename>app/controllers/groups_controller.rb</filename>
    </added>
    <added>
      <filename>app/controllers/memberships_controller.rb</filename>
    </added>
    <added>
      <filename>app/helpers/application_helper.rb</filename>
    </added>
    <added>
      <filename>app/helpers/group_permissions_helper.rb</filename>
    </added>
    <added>
      <filename>app/helpers/groupphotos_helper.rb</filename>
    </added>
    <added>
      <filename>app/helpers/groups_helper.rb</filename>
    </added>
    <added>
      <filename>app/helpers/memberships_helper.rb</filename>
    </added>
    <added>
      <filename>app/models/group.rb</filename>
    </added>
    <added>
      <filename>app/models/group_permission.rb</filename>
    </added>
    <added>
      <filename>app/models/group_role.rb</filename>
    </added>
    <added>
      <filename>app/models/groupphoto.rb</filename>
    </added>
    <added>
      <filename>app/models/membership.rb</filename>
    </added>
    <added>
      <filename>app/models/membership_status.rb</filename>
    </added>
    <added>
      <filename>app/views/group_permissions/.svn/all-wcprops</filename>
    </added>
    <added>
      <filename>app/views/group_permissions/.svn/entries</filename>
    </added>
    <added>
      <filename>app/views/group_permissions/.svn/format</filename>
    </added>
    <added>
      <filename>app/views/group_permissions/.svn/text-base/edit.html.erb.svn-base</filename>
    </added>
    <added>
      <filename>app/views/group_permissions/.svn/text-base/index.html.erb.svn-base</filename>
    </added>
    <added>
      <filename>app/views/group_permissions/.svn/text-base/new.html.erb.svn-base</filename>
    </added>
    <added>
      <filename>app/views/group_permissions/.svn/text-base/show.html.erb.svn-base</filename>
    </added>
    <added>
      <filename>app/views/group_permissions/edit.html.erb</filename>
    </added>
    <added>
      <filename>app/views/group_permissions/index.html.erb</filename>
    </added>
    <added>
      <filename>app/views/group_permissions/new.html.erb</filename>
    </added>
    <added>
      <filename>app/views/group_permissions/show.html.erb</filename>
    </added>
    <added>
      <filename>app/views/groupphotos/.svn/all-wcprops</filename>
    </added>
    <added>
      <filename>app/views/groupphotos/.svn/entries</filename>
    </added>
    <added>
      <filename>app/views/groupphotos/.svn/format</filename>
    </added>
    <added>
      <filename>app/views/groupphotos/.svn/text-base/_manage_groupphotos.haml.svn-base</filename>
    </added>
    <added>
      <filename>app/views/groupphotos/.svn/text-base/_show_image_list.haml.svn-base</filename>
    </added>
    <added>
      <filename>app/views/groupphotos/.svn/text-base/edit.html.haml.svn-base</filename>
    </added>
    <added>
      <filename>app/views/groupphotos/.svn/text-base/index.html.haml.svn-base</filename>
    </added>
    <added>
      <filename>app/views/groupphotos/.svn/text-base/index.rxml.svn-base</filename>
    </added>
    <added>
      <filename>app/views/groupphotos/.svn/text-base/manage_groupphotos.rjs.svn-base</filename>
    </added>
    <added>
      <filename>app/views/groupphotos/.svn/text-base/new.html.haml.svn-base</filename>
    </added>
    <added>
      <filename>app/views/groupphotos/.svn/text-base/recent.html.haml.svn-base</filename>
    </added>
    <added>
      <filename>app/views/groupphotos/.svn/text-base/show.html.haml.svn-base</filename>
    </added>
    <added>
      <filename>app/views/groupphotos/.svn/text-base/slideshow.rhtml.svn-base</filename>
    </added>
    <added>
      <filename>app/views/groupphotos/_manage_groupphotos.haml</filename>
    </added>
    <added>
      <filename>app/views/groupphotos/_show_image_list.haml</filename>
    </added>
    <added>
      <filename>app/views/groupphotos/edit.html.haml</filename>
    </added>
    <added>
      <filename>app/views/groupphotos/index.html.haml</filename>
    </added>
    <added>
      <filename>app/views/groupphotos/index.rxml</filename>
    </added>
    <added>
      <filename>app/views/groupphotos/manage_groupphotos.rjs</filename>
    </added>
    <added>
      <filename>app/views/groupphotos/new.html.haml</filename>
    </added>
    <added>
      <filename>app/views/groupphotos/recent.html.haml</filename>
    </added>
    <added>
      <filename>app/views/groupphotos/show.html.haml</filename>
    </added>
    <added>
      <filename>app/views/groupphotos/slideshow.rhtml</filename>
    </added>
    <added>
      <filename>app/views/groups/.svn/all-wcprops</filename>
    </added>
    <added>
      <filename>app/views/groups/.svn/entries</filename>
    </added>
    <added>
      <filename>app/views/groups/.svn/format</filename>
    </added>
    <added>
      <filename>app/views/groups/.svn/prop-base/edit.html.haml.svn-base</filename>
    </added>
    <added>
      <filename>app/views/groups/.svn/prop-base/index.html.haml.svn-base</filename>
    </added>
    <added>
      <filename>app/views/groups/.svn/prop-base/new.html.haml.svn-base</filename>
    </added>
    <added>
      <filename>app/views/groups/.svn/prop-base/show.html.haml.svn-base</filename>
    </added>
    <added>
      <filename>app/views/groups/.svn/text-base/_group.html.haml.svn-base</filename>
    </added>
    <added>
      <filename>app/views/groups/.svn/text-base/_profile_group_info_sidebar.html.haml.svn-base</filename>
    </added>
    <added>
      <filename>app/views/groups/.svn/text-base/_search_options.html.haml.svn-base</filename>
    </added>
    <added>
      <filename>app/views/groups/.svn/text-base/edit.html.haml.svn-base</filename>
    </added>
    <added>
      <filename>app/views/groups/.svn/text-base/index.html.haml.svn-base</filename>
    </added>
    <added>
      <filename>app/views/groups/.svn/text-base/new.html.haml.svn-base</filename>
    </added>
    <added>
      <filename>app/views/groups/.svn/text-base/roster.html.haml.svn-base</filename>
    </added>
    <added>
      <filename>app/views/groups/.svn/text-base/show.html.haml.svn-base</filename>
    </added>
    <added>
      <filename>app/views/groups/_group.html.haml</filename>
    </added>
    <added>
      <filename>app/views/groups/_profile_group_info_sidebar.html.haml</filename>
    </added>
    <added>
      <filename>app/views/groups/_search_options.html.haml</filename>
    </added>
    <added>
      <filename>app/views/groups/edit.html.haml</filename>
    </added>
    <added>
      <filename>app/views/groups/index.html.haml</filename>
    </added>
    <added>
      <filename>app/views/groups/new.html.haml</filename>
    </added>
    <added>
      <filename>app/views/groups/show.html.haml</filename>
    </added>
    <added>
      <filename>app/views/memberships/.svn/all-wcprops</filename>
    </added>
    <added>
      <filename>app/views/memberships/.svn/entries</filename>
    </added>
    <added>
      <filename>app/views/memberships/.svn/format</filename>
    </added>
    <added>
      <filename>app/views/memberships/.svn/text-base/_membership.html.haml.svn-base</filename>
    </added>
    <added>
      <filename>app/views/memberships/.svn/text-base/accepted.html.haml.svn-base</filename>
    </added>
    <added>
      <filename>app/views/memberships/.svn/text-base/denied.html.haml.svn-base</filename>
    </added>
    <added>
      <filename>app/views/memberships/.svn/text-base/edit.html.erb.svn-base</filename>
    </added>
    <added>
      <filename>app/views/memberships/.svn/text-base/index.html.erb.svn-base</filename>
    </added>
    <added>
      <filename>app/views/memberships/.svn/text-base/new.html.erb.svn-base</filename>
    </added>
    <added>
      <filename>app/views/memberships/.svn/text-base/pending.html.haml.svn-base</filename>
    </added>
    <added>
      <filename>app/views/memberships/.svn/text-base/show.html.erb.svn-base</filename>
    </added>
    <added>
      <filename>app/views/memberships/_membership.html.haml</filename>
    </added>
    <added>
      <filename>app/views/memberships/accepted.html.haml</filename>
    </added>
    <added>
      <filename>app/views/memberships/denied.html.haml</filename>
    </added>
    <added>
      <filename>app/views/memberships/edit.html.erb</filename>
    </added>
    <added>
      <filename>app/views/memberships/index.html.erb</filename>
    </added>
    <added>
      <filename>app/views/memberships/new.html.erb</filename>
    </added>
    <added>
      <filename>app/views/memberships/pending.html.haml</filename>
    </added>
    <added>
      <filename>app/views/memberships/show.html.erb</filename>
    </added>
    <added>
      <filename>app/views/shared/_group_location_chooser.html.haml</filename>
    </added>
    <added>
      <filename>db/migrate/063_create_groups.rb</filename>
    </added>
    <added>
      <filename>db/migrate/064_add_type_to_group.rb</filename>
    </added>
    <added>
      <filename>db/migrate/065_create_user_groups.rb</filename>
    </added>
    <added>
      <filename>db/migrate/066_create_memberships.rb</filename>
    </added>
    <added>
      <filename>db/migrate/067_add_type_to_role.rb</filename>
    </added>
    <added>
      <filename>db/migrate/068_create_group_permissions.rb</filename>
    </added>
    <added>
      <filename>db/migrate/069_rename_role_id_to_group_role_id_in_group_permissions.rb</filename>
    </added>
    <added>
      <filename>db/migrate/070_add_groups_count_to_metro_area.rb</filename>
    </added>
    <added>
      <filename>db/migrate/071_add_state_id_country_id_metro_area_id_to_groups.rb</filename>
    </added>
    <added>
      <filename>db/migrate/072_create_groupphotos.rb</filename>
    </added>
    <added>
      <filename>db/migrate/073_add_avatar_id_to_groups.rb</filename>
    </added>
    <added>
      <filename>db/migrate/074_add_description_to_groups.rb</filename>
    </added>
    <added>
      <filename>db/migrate/075_add_view_count_to_groups.rb</filename>
    </added>
    <added>
      <filename>db/migrate/076_set_default_value_on_view_count_in_groups.rb</filename>
    </added>
    <added>
      <filename>db/migrate/077_create_membership_statuses.rb</filename>
    </added>
    <added>
      <filename>db/migrate/078_add_membership_statuses.rb</filename>
    </added>
    <added>
      <filename>db/migrate/079_add_initiator_to_memberships.rb</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -35,7 +35,24 @@ class Comment &lt; ActiveRecord::Base
       :limit =&gt; options[:limit]  
     )
   end
-    
+
+  def self.find_groupphoto_comments_for(group)
+    Comment.find(:all, :conditions =&gt; [&quot;recipient_id = ? AND commentable_type = ?&quot;, group.owner.id, 'Groupphoto'], :order =&gt; 'created_at DESC')
+  end
+
+  def self.find_group_comments_for(group)
+    Comment.find(:all, :conditions =&gt; [&quot;recipient_id = ? AND commentable_type = ?&quot;, group.owner.id, 'Group'], :order =&gt; 'created_at DESC')
+  end
+
+  def self.find_comments_by_group(group, *args)
+    options = args.extract_options!
+    find(:all,
+      :conditions =&gt; [&quot;commentable_id = ?&quot;, group.id],
+      :order =&gt; &quot;created_at DESC&quot;,
+      :limit =&gt; options[:limit]
+    )
+  end
+   
   def previous_commenters_to_notify
     # only send a notification on recent comments
     # limit the number of emails we'll send (or posting will be slooowww)</diff>
      <filename>app/models/comment.rb</filename>
    </modified>
    <modified>
      <diff>@@ -53,6 +53,11 @@ class User &lt; ActiveRecord::Base
     has_many :friendships_not_initiated_by_me, :class_name =&gt; &quot;Friendship&quot;, :foreign_key =&gt; &quot;user_id&quot;, :conditions =&gt; ['initiator = ?', false], :dependent =&gt; :destroy
     has_many :occurances_as_friend, :class_name =&gt; &quot;Friendship&quot;, :foreign_key =&gt; &quot;friend_id&quot;, :dependent =&gt; :destroy
 
+    #group associations
+    has_many :memberships
+    has_many :groups, :through =&gt; :membership, :order =&gt; 'name'
+    has_many :memberships_initiated_by_me, :class_name =&gt; &quot;Membership&quot;, :foreign_key =&gt; &quot;user_id&quot;, :conditions =&gt; ['initiator = ?', true], :dependent =&gt; :destroy
+
     #forums
     has_many :moderatorships, :dependent =&gt; :destroy
     has_many :forums, :through =&gt; :moderatorships, :order =&gt; 'forums.name'
@@ -82,6 +87,22 @@ class User &lt; ActiveRecord::Base
 
   ## Class Methods
 
+  def is_in_group?(group)
+    groups.find_by_id(group.id)
+  end
+
+  def can_request_membership_with(group)
+    !self.eql?(group.owner) &amp;&amp; !self.membership_exists_with?(group)
+  end
+
+  def membership_exists_with?(group)
+    Membership.find(:first, :conditions =&gt; [&quot;group_id = ? AND user_id = ?&quot;, group.id, self.id])
+  end
+
+  def has_reached_daily_member_request_limit?
+    memberships_initiated_by_me.count(:conditions =&gt; ['created_at &gt; ?', Time.now.beginning_of_day]) &gt;= Membership.daily_request_limit
+  end
+  
   # override activerecord's find to allow us to find by name or id transparently
   def self.find(*args)
     if args.is_a?(Array) and args.first.is_a?(String) and (args.first.index(/[a-zA-Z\-_]+/) or args.first.to_i.eql?(0) )</diff>
      <filename>app/models/user.rb</filename>
    </modified>
    <modified>
      <diff>@@ -7,15 +7,15 @@
       \:
     = text_field_tag 'login', nil, :size =&gt; 35
 
-    %label{&quot;for&quot;=&gt;&quot;password&quot;} 
+    %label{&quot;for&quot;=&gt;&quot;password&quot;}
       =:password.l
       \:
     = password_field_tag 'password', nil, :size =&gt; 35
 
     %fieldset
-      %label{&quot;for&quot;=&gt;&quot;remember_me&quot;} 
+      %label{&quot;for&quot;=&gt;&quot;remember_me&quot;}
         =:remember_me.l
         \:
         = check_box_tag 'remember_me'
-    
+
     %p= submit_tag :log_in.l</diff>
      <filename>app/views/base/teaser.html.haml</filename>
    </modified>
    <modified>
      <diff>@@ -2,7 +2,20 @@
 recent_forum_posts '/forums/recent', :controller =&gt; 'sb_posts', :action =&gt; 'index'
 resources :forums, :sb_posts, :monitorship
 resources :sb_posts, :name_prefix =&gt; 'all_', :collection =&gt; { :search =&gt; :get, :monitored =&gt; :get }
+resources :group_permissions
 
+memberships '/memberships', :controller =&gt; 'memberships', :action =&gt; 'index'
+
+resources :groups, :member =&gt; {
+  :change_profile_groupphoto =&gt; :put,
+  :welcome_groupphoto =&gt; :get,
+  :roster =&gt; :get,
+  } do |group|
+  group.resources :groupphotos, :collection =&gt; {:swfupload =&gt; :post, :slideshow =&gt; :get}
+  group.resources :memberships, :member =&gt; { :accept =&gt; :put, :deny =&gt; :put }, :collection =&gt; { :accepted =&gt; :get, :pending =&gt; :get, :denied =&gt; :get }
+end
+
+  
 %w(forum).each do |attr|
   resources :sb_posts, :name_prefix =&gt; &quot;#{attr}_&quot;, :path_prefix =&gt; &quot;/#{attr.pluralize}/:#{attr}_id&quot;
 end
@@ -124,6 +137,8 @@ resources :users, :member_path =&gt; '/:id', :nested_member_path =&gt; '/:user_id', :m
   user.resources :favorites, :name_prefix =&gt; 'user_'
   user.resources :messages, :collection =&gt; { :delete_selected =&gt; :post, :auto_complete_for_username =&gt; :any }  
   user.resources :comments
+  user.resources :groups
+  
 end
 resources :votes
 resources :invitations</diff>
      <filename>config/desert_routes.rb</filename>
    </modified>
    <modified>
      <diff>@@ -13,6 +13,73 @@ en:
     attributes:
       photo:
         created_at: &quot;created at: &quot;
+
+#Group Additions Begin
+  thumbnail: Thumbnail
+  add: Add
+  remove: Remove
+  tell_us: Tell us what do you think!
+
+#Memberships
+  request_membership: I'm a fan!!
+  sorry_there_was_an_error_requesting_membership: Sorry, there was an error requesting membership.
+  requesting_membership: Requesting membership
+  membership_requested: Requested membership with {group}.
+  requested_membership_with: Requested membership with
+  pending_memberships: Pending Memberships
+  accepted_memberships: Accepted Memberships
+  the_membership_was_accepted: The membership was accepted
+  my_members: Our Fans
+  view_all_my_member_requests: View all fan requests
+
+#Groups
+  groups: Groups
+  new_group: New Group
+  editing_group: Editing Group
+  edit_group: Edit Group Details
+  site_groups: &quot;{site} Groups&quot;
+  created_a_group: created a new Group
+  search_groups: Search Groups
+  group_name: Group Name
+  back_to_all_groups: Back to all Groups
+  group_details: Group Details
+  group_views: Group Views
+  small_group: &quot;{group} doesn't have much here yet. Stay tuned.&quot;
+  groups_recent_comments: Recent comments
+  group_comments: Group comments
+  group_roster: Manage Group Roster
+  manager_controls: Group Manager Controls
+  make_fan: Add to Fans
+  is_now_a: &quot;{user} is now a {rolename} with the {group} Group&quot;
+
+
+#GroupPhotos
+  choose_a_photo_for_your_group: Choose a Photo for your Group
+  group_photo: Group Photo
+  add_a_groupphoto: Add Group Photo
+  view_all_groupphotos: Check out all Group Photos
+  group_photos: Group Photos
+  groups_groupphotos: &quot;{group}'s Photos&quot;
+  new_groupphoto: New photo
+  groupphoto_tip_1: Photos show your Group to the world. Pick your best pics, and give them good titles and descriptions.
+  groupphoto_tip_2: Use tags to organize your photos. Separate tags with commas.
+  back_to_my_groupphotos: Back to your Groups photos
+  cancel_and_go_back_to_my_groupphotos: cancel and go back to your Groups photos
+  related_groupphotos_all_members: Related Photos (all members)
+  groupphotos: Group Photos
+  make_this_my_profile_groupphoto: Make this my Groups profile photo
+  edit_this_groupphoto_details: Edit this photo
+  delete_this_groupphoto: Delete this photo
+  groupphoto_comments: Photo comments
+  tags_are_keywords_you_use_to_organize_your_groupphotos: Tags are keywords you use to organize your photos. Separate multiple tags with commas.
+  show_this_groupphoto: Show this photo
+  back_to_my_groupphotos: Back to Groups photos
+  are_you_sure_you_want_to_delete_this_groupphoto: &quot;Are you sure you want to delete this photo?&quot;
+  editing_groupphoto: Editing photo
+  uploaded_a_groupphoto: uploaded a Group photo
+  no_profile_groupphoto: No Group photo
+  view_all_my_groupphotos: View all Group photos
+
   #en: a_few_seconds_ago:  a few seconds ago
   a_few_seconds_ago:  a few seconds ago
   #en: about: About</diff>
      <filename>lang/ui/en-US.yml</filename>
    </modified>
    <modified>
      <diff>@@ -16,6 +16,7 @@
       - Category.find(:all).each do |c|
         = topnav_tab c.name, {:url =&gt; category_path(c), :section =&gt; c.name}
       = topnav_tab &quot;Discussions&quot;, { :url =&gt; forums_path, :section =&gt; 'forums' }
+      = topnav_tab :groups.l, { :url =&gt; groups_path, :section =&gt; 'groups' }
       = topnav_tab &quot;Profiles&quot;, { :url =&gt; users_path, :section =&gt; 'users' }
       - if current_user 
         = topnav_tab &quot;My Profile&quot;, { :url =&gt; user_path(current_user), :section =&gt; 'my_profile'}   </diff>
      <filename>sample_files/sample_themes/dappled/views/shared/_header.html.haml</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>17f1181de601faba635a88a719fe5cbaccd97eb3</id>
    </parent>
    <parent>
      <id>a2d2f4b5c13a9a136d49f7cc1b94746219e9c83e</id>
    </parent>
  </parents>
  <author>
    <name>bborn</name>
    <email>bruno.bornsztein@gmail.com</email>
  </author>
  <url>http://github.com/bborn/communityengine/commit/b6a2d9a1b03370b59b712cc7e0282af3ace26dc8</url>
  <id>b6a2d9a1b03370b59b712cc7e0282af3ace26dc8</id>
  <committed-date>2009-06-17T19:09:53-07:00</committed-date>
  <authored-date>2009-06-17T19:09:53-07:00</authored-date>
  <message>Merge branch 'master' of git://github.com/LeviRosol/communityengine into LeviRosol/master</message>
  <tree>752e3924ad3893f1a508e38aa8301974da7c2b72</tree>
  <committer>
    <name>bborn</name>
    <email>bruno.bornsztein@gmail.com</email>
  </committer>
</commit>
